0

我有包含双关语的挑战,并且可以对双关语进行投票。在 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">&#10084;</span>&nbsp;<%= pun.votes_for.size %>&nbsp;
    <% 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

任何人都可以帮忙吗?

4

1 回答 1

2

我认为代码是用于双关语集合的。我认为问题在于您的形式如下:

@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| %>

或者在控制器中解决。但需要查看它的控制器代码。

于 2018-04-29T09:10:03.030 回答