Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # выдержка из паршала ответа. кнопка like, счетчик голосов, кнопка dislike
- .vote = link_to 'like', any_votes_path( subject_type: Answer, subject_id: answer, votes_value: 1 ), remote: true, method: :patch
- div class="answer_votes_count_#{answer.id}" = answer.votes_count
- .vote = link_to 'dislike', any_votes_path( subject_type: Answer, subject_id: answer, votes_value: -1 ), remote: true, method: :patch
- # контроллер Votes, за который ты меня, так сказать, поругал, но, в итоге, все довольно компактно получилось
- class VotesController < ApplicationController
- def any
- subject_type = params[:subject_type]
- subject_id = params[:subject_id]
- votes_value = params[:votes_value].to_i
- @vote = Vote.where(user: current_user, subject_id: subject_id, subject_type: subject_type).first
- if @vote
- @vote.update_value(votes_value)
- else
- @vote = Vote.create(user: current_user, subject_id: subject_id, subject_type: subject_type, value: votes_value)
- @vote.update_subject_votes_count(votes_value)
- end
- respond_to { |format| format.json { render partial: 'votes/votes' } }
- end
- end
- # модель Vote
- class Vote < ApplicationRecord
- belongs_to :user
- belongs_to :subject, polymorphic: true
- validates :user, :subject, :value, presence: true
- validates :user, uniqueness: { scope: :subject_id }
- def update_value(vote_value)
- unless value == vote_value
- update(value: value + vote_value)
- update_subject_votes_count(vote_value)
- end
- end
- def update_subject_votes_count(vote_value)
- new_value = subject.votes_count + vote_value
- subject.update(votes_count: new_value)
- end
- end
- теперь к тестам.
- при запуске даже простейшего теста получаю ошибку на 3 экрана)
- пишу так(опуская лишнее) -
- given(:user) { create(:user) }
- given(:user2) { create(:user) }
- given(:user3) { create(:user) }
- given!(:question) { create(:question, user: user) }
- given!(:answer) { create(:answer, user: user2, question: question) }
- describe 'Authenticated user' do
- before do
- sign_in user
- visit question_path(question)
- end
- scenario 'vote for the answer - like', js: true do
- click_link 'like'
- end
- end
- вот верхний трейс
- 2017-11-23 14:02:24 +0300: Rack app error handling request { PATCH /votes/any }
- #<NoMethodError: undefined method `votes_count' for nil:NilClass>
- /home/slim/projects/ruby/gse/app/models/vote.rb:16:in `update_subject_votes_count'
- /home/slim/projects/ruby/gse/app/controllers/votes_controller.rb:13:in `any'
- то есть, он идет в контроллер, проверяет, есть ли уже объект Vote для этого ответа, видит, что его нет(а его и нет, ответ новый), идет в else, через else создает в базе объект Vote, далее идет в модель и изменяет у ответа количество голосов. Но этот объект у него nil почему то...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement