Rails 4:如何删除嵌套对象?

时间:2016-11-23 14:08:37

标签: ruby-on-rails ruby ruby-on-rails-4

所以我有一个用户模型和嵌套模型“Entries”,如:

user.rb

class User < ActiveRecord::Base

  has_many :entries
  ...

end

entry.rb

class Entry < ActiveRecord::Base

  belongs_to :user
  ...

end

用户/ show.html.erb

<p><%= link_to 'Destroy', remove_entry_path, method: :delete, data: { confirm: 'Are you sure?' } %></p>

的routes.rb

resources :users do
    resources :entries
end
...
delete "remove_entry" => "entries#destroy", :as => "remove_entry"

entries_controller.rb

def destroy

    @user = current_user
    @user.entries.find(params[:id]).destroy

    respond_to do |format|
      format.html { redirect_to user_path(current_user), notice: 'Entry was successfully destroyed.' }
      format.json { head :no_content }
    end

  end

我收到了这个错误:

无法找到没有ID的条目

在这一行

@user.entries.find(params[:id]).destroy

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您需要将ID传递给此路线:

delete "remove_entry" => "entries#destroy", :as => "remove_entry"

remove_entry路由没有id的位置参数,在你对remove_entry_path的调用中,你没有提供id参数。

这就是为什么在你的控制器动作中,params [:id] == nil

<强>解决方案

传递ID

<p><%= link_to 'Destroy', remove_entry_path(id: @entry.id), method: :delete, data: { confirm: 'Are you sure?' } %></p>

或在路线中添加位置参数并将id传递给url助手。

# config/routes.rb
delete "remove_entry/:id" => "entries#destroy", :as => "remove_entry"

<!-- in view -->
<p><%= link_to 'Destroy', remove_entry_path(id: @entry.id), method: :delete, data: { confirm: 'Are you sure?' } %></p>

答案 1 :(得分:0)

您收到的params[:id]nil,这就是您收到此错误的原因

  

无法找到没有ID的条目

使用路径助手传递@entry对象

<p><%= link_to 'Destroy', remove_entry_path(@entry), method: :delete, data: { confirm: 'Are you sure?' } %></p>