1

「投稿」モデルと「コメント」モデルで構成されたボードを作成しています。

私が作っているボードはサインイン手続きが不要なので、投稿やコメントの削除にはパスワードが必要です。

投稿を削除しようとすると、以下のコードがうまく機能します。(ユーザーが「削除」ボタンをクリックすると、パスワードフォームを持つ非表示の 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>

レールに適切なフォームタグのアクション属性の値を見つけさせるにはどうすればよいですか? (この場合、"/comments/20" ではなく "/comments/10" にする必要があります。)

4

1 に答える 1

1

Rails に URL を生成させます。現時点では、自分で URL を設定していますが、値を指定していないため:id、rails は現在の値を取得しますparams[:id]

試す

form_for(comment, :method => :delete)

その代わり。

于 2012-08-29T18:27:52.570 に答える