如何让rails识别活动记录的正确ID?

时间:2012-08-29 18:05:24

标签: ruby-on-rails ruby-on-rails-3

我正在制作一个由“后期”模型和“评论”模型组成的董事会。

我正在制作的电路板不需要登录程序,因此删除帖子或评论时需要密码。

当我尝试删除帖子时,下面的代码效果很好。 (如果用户单击“删除”按钮,则会显示具有密码表单的隐藏DIV,因此我使用了form_for。)

<%= link_to_function "Delete", "$('#post_password_box').toggle()" %> |
<div id="post_password_box">
  <%= form_for(@post, url: { action: "destroy"}, html: { method: :delete, class: nil, id: nil}) do |f| %>
    <%= f.label :password %>
    <%= f.password_field :password %><br>

    <%= f.submit "Commit", class: "btn", data: { confirm: "Are you sure?" } %>
    <%= button_to_function "Cancel", "$('#post_password_box').hide()", class: "btn" %>
  <% end %>
</div>

因此,我在删除评论时使用了类似的代码。

  <% @comments.each do |comment| %>
    <li class="author"><%= comment.author %></li>
    <li class="content"><%= comment.content %></li>
    <li class="date"><%= comment.created_at.localtime.strftime("%r") %></li>
    <li class="button">
      <%= link_to_function "X", "$(this).next().toggle()" %>
      <div class="comment_password_box">
        <%= form_for(comment, url: {controller: "comments", action: "destroy"}, html: {method: :delete, class: nil, id: nil}) do |f| %>
          <%= f.label :password %>
          <%= f.password_field :password %>

          <%= f.submit %>
        <% end %>
      </div>
    </li>
  <% end %>

乍一看,上面的代码似乎运行良好,但是代码中没有删除正确评论的问题。

例如,如果帖子的ID为20且我要删除的评论的ID为10,则删除id为20的评论。

我发现问题来自于每个评论中表单标签的动作属性如下所示。

        <form accept-charset="UTF-8" action="/comments/20" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="delete" /><input name="authenticity_token" type="hidden" value="Y2oBuoIxa+9yPLC5WflKVVELw3jgKsi9s9/8Cfvr2u8=" /></div>

如何让rails找到正确的表单标签的action属性值? (在这种情况下,它应该是“/ comments / 10”,而不是“/ comments / 20”。)

1 个答案:

答案 0 :(得分:1)

让rails为您生成网址。目前您自己设置了网址,但未指定:id的值,因此rails获取当前值params[:id]

尝试

form_for(comment, :method => :delete)

相反。