chinezan

help are needed

Nov 23rd, 2017
675
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # выдержка из паршала ответа. кнопка like, счетчик голосов, кнопка dislike
  2.     .vote = link_to 'like', any_votes_path( subject_type: Answer, subject_id: answer, votes_value: 1 ), remote: true, method: :patch
  3.     div class="answer_votes_count_#{answer.id}"  = answer.votes_count
  4.     .vote = link_to 'dislike', any_votes_path( subject_type: Answer, subject_id: answer, votes_value: -1 ), remote: true, method: :patch
  5.  
  6. # контроллер Votes, за который ты меня, так сказать, поругал, но, в итоге, все довольно компактно получилось
  7. class VotesController < ApplicationController
  8.  
  9.   def any
  10.     subject_type = params[:subject_type]
  11.     subject_id = params[:subject_id]
  12.     votes_value = params[:votes_value].to_i
  13.  
  14.     @vote = Vote.where(user: current_user, subject_id: subject_id, subject_type: subject_type).first
  15.     if @vote
  16.       @vote.update_value(votes_value)
  17.     else
  18.       @vote = Vote.create(user: current_user, subject_id: subject_id, subject_type: subject_type, value: votes_value)
  19.       @vote.update_subject_votes_count(votes_value)
  20.     end
  21.     respond_to { |format| format.json { render partial: 'votes/votes' } }
  22.   end
  23. end
  24.  
  25. # модель Vote
  26. class Vote < ApplicationRecord
  27.   belongs_to :user
  28.   belongs_to :subject, polymorphic: true
  29.  
  30.   validates :user, :subject, :value, presence: true
  31.   validates :user, uniqueness: { scope: :subject_id }
  32.  
  33.   def update_value(vote_value)
  34.     unless value == vote_value
  35.       update(value: value + vote_value)
  36.       update_subject_votes_count(vote_value)
  37.     end
  38.   end
  39.  
  40.   def update_subject_votes_count(vote_value)
  41.     new_value = subject.votes_count + vote_value
  42.     subject.update(votes_count: new_value)
  43.   end
  44. end
  45.  
  46. теперь к тестам.
  47. при запуске даже простейшего теста получаю ошибку на 3 экрана)
  48. пишу так(опуская лишнее) -
  49.  
  50.   given(:user)     { create(:user) }
  51.   given(:user2)    { create(:user) }
  52.   given(:user3)    { create(:user) }
  53.   given!(:question) { create(:question, user: user) }
  54.   given!(:answer)   { create(:answer, user: user2, question: question) }
  55.  
  56.   describe 'Authenticated user' do
  57.     before do
  58.       sign_in user
  59.       visit question_path(question)
  60.     end
  61.  
  62.     scenario 'vote for the answer - like', js: true do
  63.       click_link 'like'
  64.     end
  65.   end
  66.  
  67. вот верхний трейс
  68. 2017-11-23 14:02:24 +0300: Rack app error handling request { PATCH /votes/any }
  69. #<NoMethodError: undefined method `votes_count' for nil:NilClass>
  70. /home/slim/projects/ruby/gse/app/models/vote.rb:16:in `update_subject_votes_count'
  71. /home/slim/projects/ruby/gse/app/controllers/votes_controller.rb:13:in `any'
  72.  
  73. то есть, он идет в контроллер, проверяет, есть ли уже объект Vote для этого ответа, видит, что его нет(а его и нет, ответ новый), идет в else, через else создает в базе объект Vote, далее идет в модель и изменяет у ответа количество голосов. Но этот объект у него nil почему то...
RAW Paste Data