在页面上以不同的顺序呈现会破坏路由
Render in a different order on the page breaks the routing
我有包含双关语的挑战,并且可以对双关语进行投票。在 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 不是突然不可用并且投票 link 中断。
No route matches {:action=>"upvote", :challenge_id=>"9", :controller=>"puns", :id=>nil}, missing required keys: [:id]
这是导致问题的 puns/form 部分
<% 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| %>
或者在controller中解决。但是需要查看它的控制器代码。
我有包含双关语的挑战,并且可以对双关语进行投票。在 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 不是突然不可用并且投票 link 中断。
No route matches {:action=>"upvote", :challenge_id=>"9", :controller=>"puns", :id=>nil}, missing required keys: [:id]
这是导致问题的 puns/form 部分
<% 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| %>
或者在controller中解决。但是需要查看它的控制器代码。