[英]Render in a different order on the page breaks the routing
我有包含雙關語的挑戰,可以對雙關語進行投票。 在“挑戰顯示”頁面上,將顯示所有雙關語並顯示其票數。 當前在視圖頁面上:
<%= 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
有人可以幫忙嗎?
我認為代碼適用於雙關語集合。 我認為問題在於表單的格式如下:
@challenge.puns.build
因此,在@challenge.puns
集合似乎沒有保留的記錄(沒有ID),因此無法生成該模型的路徑。
作為快速解決方案,我建議:
<%= render @challenge.puns.reverse.select(&:persisted?) %>
更新:我以為你有
<%= form_for([@challenge, @challenge.puns.build]) do |f| %>
您也可以嘗試:
<%= form_for([@challenge, Pun.new]) do |f| %>
或在控制器中解決。 但是需要查看它的控制器代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.