1

我正在制作一个由“post”模型和“comment”模型组成的板。

我做的板子不需要登录程序,所以删除帖子或评论需要密码。

当我尝试删除帖子时,下面的代码运行良好。(如果用户点击“删除”按钮,会出现隐藏的带有密码表单的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”。)

4

1 回答 1

1

让 rails 为您生成 URL。目前您正在自己设置 URL,但您没有指定值,:id因此 rails 采用当前值params[:id]

尝试

form_for(comment, :method => :delete)

反而。

于 2012-08-29T18:27:52.570 回答