【问题标题】:How to delete nested record如何删除嵌套记录
【发布时间】:2012-07-08 06:48:09
【问题描述】:

我的女模特有 cmets 使用 gem 'acts_as_commentable'

当我访问 example.com/girls/show/1
它显示了 ID#1 女孩的个人资料。 所有已发布的 cmets 都显示在本页底部。

对于每个评论行,我想添加删除按钮来删除评论。

如果它应该将参数传递给girls_controller.rb 的comment_destroy 动作。 动作部分和视图应该如何?

下面的代码会导致未定义的局部变量或方法`girls'错误。

"girls/show.html.erb" 视图应该是这样的。只是一部分。

<table>
  <tr>
    <th>ID</th>
    <th>Title</th>
    <th>Body</th>
    <th>Subject</th>
    <th>Delete</th>
  </tr>

<% @all_comments.each do |comment| %>
  <tr>
    <td><%= comment.id %></td>
    <td><%= comment.title %></td>
    <td><%= comment.body %></td>
    <td><%= comment.subject %></td>
    <td><%= button_to 'comment_destroy', girls, confirm: 'Are you sure?', :disable_with => 'deleting...', method: :delete %></td>
   </tr>
<% end %>
</table>

girls_controller.rb 的 comment_destroy 动作应该是这样的

  def comment_destroy
    @comment = comment.find(params[:id])
    @comment.destroy

    respond_to do |format|
      format.html { redirect_to girls_url }
      format.json { head :ok }
    end
    redirect_to :controller => 'girls', :action => 'show', :id => params[:girls][:id]
    flash[:notice] = "comment deleted!"
  end

【问题讨论】:

  • 您应该将您的路线添加到您的问题中。但似乎你需要阅读和研究如何处理 CRUD。在 codeschool.com 上查看官方指南、railscast 或 Rails 僵尸课程
  • 使用 AJAX 或查看 _destroy "param"。
  • 谢谢!!我应该在视图部分添加什么来传递参数???

标签: ruby-on-rails ruby-on-rails-3 view controller parameter-passing


【解决方案1】:

您似乎在一个女孩下嵌套了 cmets,并且您想删除该评论。

路线

resources :girls do
  resources :comments, only: [:create, :destroy]
end

然后,您有一个 cmets 控制器来处理您的创建和销毁。

<%= button_to 'comment_destroy', [@girl, comment], confirm: 'Are you sure?', :disable_with => 'deleting...', method: :delete %>

您的 cmets 控制器中的 destroy 方法:

def destroy
  @girl = Girl.find(params[:girl_id])
  @comment = @girl.comments.find(params[:id])
  if @comment.destroy
    redirect_to @girl, notice: "Comment Removed"
  else
    redirect_to @girl, error: "We could not remove the comment"
  end
end

结束

更新 -- 基于用户使用非 RESTful 解决方案的请求

路线:

resources :girls do
  member do
    delete :delete_comment, to: "girls#delete_comment", as: "delete_comment"
  end
end

控制器

def delete_comment
  @girl = Girl.find(params[:id])
  @comment = @girl.comments.find(params[:comment_id])
  if @comment.destroy
    redirect_to @girl, notice: "Comment Removed"
  else
    redirect_to @girl, error: "We could not remove the comment"
  end
end

查看链接

<%= button_to 'comment_destroy', delete_comment_path(@girl, comment_id: comment.id), confirm: 'Are you sure?', :disable_with => 'deleting...', method: :delete %>

最后一点:我真的不喜欢这个解决方案。您应该有一个 Comments 控制器并使用我的第一个解决方案。

【讨论】:

  • 感谢您的建议:) 但是如果您想删除女孩的记录怎么办?看来您正在替换女孩模型的破坏动作。
  • 你的意思是把这个方法放在cmets_controller.rb上???我没有。我应该做一个而不是写在girls_controller.rb中吗???或者你还能用girls_controller写吗?
  • @MKK 所以你想删除一个女孩记录吗?在子记录上看到删除父记录的情况并不常见。
  • 我只想要 2 个选项来删除同一控制器中的父记录或子记录(此时为女孩控制器):)
  • 我正在尝试删除父母控制器(女孩)上的子记录(评论)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
相关资源
最近更新 更多