У меня есть вызовы, содержащие Puns, и я могу голосовать за puns. На странице Challenge Show все каламбуры отображаются и показывают количество их голосов. Это в настоящее время на странице просмотра:
<%= render @challenge.puns.reverse %>
<br>
<div id="form">
<%= render "puns/form" %>
</div>
Я хочу, чтобы форма каламбуров отображалась над уже представленными элементами (каламбурами). Но если поменять их местами, вот так:
<div id="form">
<%= render "puns/form" %>
</div>
<%= render @challenge.puns.reverse %>
Я получаю сообщение об ошибке контроллера, и файл pun.id внезапно недоступен, а ссылка для голосования обрывается.
No route matches {:action=>"upvote", :challenge_id=>"9", :controller=>"puns", :id=>nil}, missing required keys: [:id]
Вот часть каламбур / форма, которая вызывает проблему
<% if signed_in? %>
<% if current_user.voted_for? pun %>
<%= pun.votes_for.size %>
<span class="pun_text"><%= link_to pun.pun_text, challenge_pun_path(@challenge, pun.id) %></span>
<% else %>
<%= link_to like_challenge_pun_path(@challenge, pun.id), method: :put do %>
<span class="heart_like">❤</span> <%= pun.votes_for.size %>
<% end %>
<span class="pun_text"><%= link_to pun.pun_text, challenge_pun_path(@challenge, pun.id) %></span>
<% end %>
<% end %>
Это like_challenge_pun_path
, который выдает ошибку, но я не могу понять, почему. Я снова объявляю @challenge
, так что он сможет получить идентификатор.
Вот форма для игры в каламбур:
<%= form_for([@challenge, @challenge.puns.build]) do |f| %>
<span class=".emoji-picker-container">
<%= f.text_area :pun_text, placeholder: "Add pun", data: { emojiable: true } %>
</span>
<%= f.submit %>
<% end %>
Кроме того, вот моя настройка маршрутов
resources :challenges do
resources :puns do
member do
put "like", to: "puns#upvote"
put "dislike", to: "puns#downvote"
end
end
end
и соответствующее действие для upvote
def upvote
@pun = @challenge.puns.find(params[:id])
@pun.upvote_by current_user
redirect_to @challenge
end
Может кто-нибудь помочь?