我有包含双关语的挑战,并且可以对双关语进行投票。在 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
这里再次声明,所以它应该能够获取id。
这是双关语的形式:
<%= 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
以及相应的投票操作
def upvote
@pun = @challenge.puns.find(params[:id])
@pun.upvote_by current_user
redirect_to @challenge
end
任何人都可以帮忙吗?