Как использовать act_as_votable для вложенного ресурса, который отображается в представлении для другой модели? Например. в контексте вопросов и ответов

У меня есть модель вопроса и модель ответа. В представлении «Показ вопросов» я использую цикл для отображения всех ответов на заданный вопрос. Я хочу включить голосование по этим ответам. Я использую гем act_as_votable.

Вот ошибка, которую я получаю при загрузке "/questions/1":

No route matches {:action=>"upvote", :controller=>"answers", :id=>nil, :question_id=>"1"} missing  required keys: [:id]

Похоже, что ответ :id не обнаруживается и, следовательно, не находит соответствующий маршрут (например, /questions/1/answers/1/like). Что я здесь делаю неправильно?

Странно то, что голосование отлично работает в индексном представлении ответов, используя тот же код. Поэтому я подозреваю, что это что-то о попытке использовать этот код через контроллер вопросов и представления. Это, вероятно, очевидная проблема, но спасибо за любые советы!

Мои вложенные маршруты:

resources :questions do
  resources :answers do
    member do
      put 'like', to: 'answers#upvote'
      put 'dislike', to: 'answers#downvote'
    end
  end
end

Контроллер моих ответов - действия по голосованию за/против:

def upvote
     @question = Question.find(params[:question_id])
     @answer = @question.answers.find(params[:id])
     @answer.upvote_by current_user
     redirect_to question_answers_path(@question)
 end

 def downvote
    @question = Question.find(params[:question_id])
    @answer = @question.answers.find(params[:id])
    @answer.downvote_by current_user
    redirect_to question_answers_path(@question)
 end

Представление «Мои вопросы» (в конце концов я сделаю это частичным)

<% @question.answers.each do |answer| %>
  <li class="answer-item">
     <div class="answer-description">
        <%= answer.description %>          
     </div>
     <div class="vote">
        <div class="col-xs-3">
          <%= link_to 'UP', like_question_answer_path(@question, answer), method: :put %>
        </div>
        <div class="col-xs-9">
        </div>
     </div>
   </li>

Мои маршруты:

    like_question_answer PUT    /questions/:question_id/answers/:id/like(.:format)    answers#upvote
dislike_question_answer  PUT    /questions/:question_id/answers/:id/dislike(.:format)  answers#downvote
       question_answers  GET    /questions/:question_id/answers(.:format)             answers#index
                         POST   /questions/:question_id/answers(.:format)             answers#create
    new_question_answer  GET    /questions/:question_id/answers/new(.:format)         answers#new
   edit_question_answer  GET    /questions/:question_id/answers/:id/edit(.:format)    answers#edit
        question_answer  GET    /questions/:question_id/answers/:id(.:format)         answers#show
                         PATCH  /questions/:question_id/answers/:id(.:format)         answers#update
                         PUT    /questions/:question_id/answers/:id(.:format)         answers#update
                         DELETE /questions/:question_id/answers/:id(.:format)         answers#destroy
            questions    GET    /questions(.:format)                                 questions#index
                         POST   /questions(.:format)                                 questions#create
            new_question GET    /questions/new(.:format)                             questions#new
           edit_question GET    /questions/:id/edit(.:format)                        questions#edit
                question GET    /questions/:id(.:format)                             questions#show
                         PATCH  /questions/:id(.:format)                             questions#update
                         PUT    /questions/:id(.:format)                             questions#update
                         DELETE /questions/:id(.:format)                             questions#destroy

person fritzthemachine    schedule 18.12.2014    source источник
comment
Можете ли вы опубликовать код upvote/downvote в контроллере вопросов?   -  person eabraham    schedule 19.12.2014
comment
У меня нет в вопросах контроллера... может в этом проблема? Я не хочу голосовать по самим вопросам.   -  person fritzthemachine    schedule 19.12.2014
comment
Можете ли вы запустить грабли маршрутов и добавить их к своему вопросу?   -  person eabraham    schedule 19.12.2014
comment
Ок, только что добавил. Спасибо!   -  person fritzthemachine    schedule 19.12.2014


Ответы (1)


No route matches {:action=>"upvote", :controller=>"answers", :id=>nil, :question_id=>"1"} missing  required keys: [:id]

Это сообщение об ошибке говорит вам все, что вам нужно знать. Когда вы находитесь в представлении ответов, id (идентификатор ответа) передается контроллеру ответов, но когда вы находитесь в представлении вопросов, нет идентификатора ответа для заполнения этого параметра запроса. Поскольку параметр отсутствует, он не соответствует регулярному выражению маршрута.

PUT questions/1/answers/1/like

Должен иметь идентификаторы, которые являются частью запроса.

ИЗМЕНИТЬ При условии, что у вас есть существующая запись вопросов и ответов. Если вы измените следующую строку, вы получите сообщение об ошибке?

<%= link_to 'UP', like_question_answer_path(Question.first, Answer.first), method: :put %>
person eabraham    schedule 19.12.2014
comment
Спасибо. Как получить идентификатор ответа для заполнения этого параметра в представлении вопроса? - person fritzthemachine; 19.12.2014
comment
Спасибо. Нет ошибок. Но тогда при множественных ответах все голосования привязываются к первому ответу. Как мне заставить его работать в контексте цикла? - person fritzthemachine; 19.12.2014
comment
Можете ли вы подтвердить, что @question.answers в коде представления возвращает объекты ответа? - person eabraham; 19.12.2014
comment
'@question.answers.first' возвращает первый объект ответа, а '@question.answers' возвращает только '#‹Answer::ActiveRecord_Associations_CollectionProxy:0x007fa058281478›' - person fritzthemachine; 19.12.2014
comment
Я думаю, что на любой вопрос, который вы пытаетесь поднять, отсутствуют ответы. CollectionProxy должен хранить массив ответов. - person eabraham; 19.12.2014
comment
Здравствуйте, у меня похожая проблема, удалось ли вам ее решить и если да, то как? - person sam; 05.02.2017