Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails activeadmin:为嵌套资源添加删除_Ruby On Rails_Ruby_Activeadmin - Fatal编程技术网

Ruby on rails activeadmin:为嵌套资源添加删除

Ruby on rails activeadmin:为嵌套资源添加删除,ruby-on-rails,ruby,activeadmin,Ruby On Rails,Ruby,Activeadmin,我有一个为许多数据中心组成的基础结构对象。在apps/admin/infrastructures.rb中,我有以下代码: form do |f| f.inputs "Infrastructure details" do f.input :name f.has_many :datacenters do |datacenter_form| datacenter_form.input :name end end f.buttons en

我有一个为许多数据中心组成的基础结构对象。在apps/admin/infrastructures.rb中,我有以下代码:

form do |f|
  f.inputs "Infrastructure details" do
    f.input :name

    f.has_many :datacenters do |datacenter_form|
      datacenter_form.input :name        
    end
  end
  f.buttons
end
我可以毫无问题地添加数据中心,但我不知道如何从基础架构表单中删除它。

这应该可以:

datacenter_form.label :_delete
datacenter_form.check_box :_delete

这将为每个嵌套对象添加一个复选框,如果选中该复选框,将删除该对象。

添加以下行:

datacenter_form.input :_destroy, :as => :boolean, :required => false, :label => 'Remove'
代码如下所示:

form do |f|
  f.inputs "Infrastructure details" do
    f.input :name

    f.has_many :datacenters do |datacenter_form|
      datacenter_form.input :name
      datacenter_form.input :_destroy, :as => :boolean, :required => false, :label => 'Remove'
    end
  end
  f.buttons
end
2017年9月更新: Rails 5.1.4、ActiveAdmin 1.0.0

许可参数
中附加
:id
\u destroy
,以及模型中的其他属性,例如在您的案例中的
:name
。然后在
f中提供
:allow_destroy
选项。其他要求保持不变;类似于在
中添加
允许销毁:true
接受
的嵌套属性

最终外观:

ActiveAdmin.register Infrastructure do
  permit_params :name, datacenters_attributes: [:id, :_destroy, :name]

  form do |f|
    f.inputs "Infrastructure details" do
      f.input :name

      f.has_many :datacenters, heading: false,
                               allow_destroy: true,
                               new_record: false do |datacenter_form|
        datacenter_form.input :name        
      end
    end
    f.buttons
  end
end


这对我很有用:

     i.input :_destroy, as: :boolean
在模型中,请记住添加:allow_destroy:

     accepts_nested_attributes_for :images, allow_destroy: true

我希望这会有所帮助(我已经更改了代码以适合您的示例,因此我希望这里没有输入错误):

控制器方法应该在datacenters.rb中定义

controller do
    def destroy
      @datacenter = Datacenter.find(params[:id])
      @datacenter.destroy
      redirect_to edit_admin_retailer_path(@datacenter.infrastructure)
    end
  end

如果无法销毁嵌套的对象。您需要在app/admin/object.rb permit\u参数中添加:_destroy

permit_params :id,:name, :cod, :_destroy

不要忘记将以下内容添加到父模型中

has_many :child_name, :dependent => :destroy

谢谢你的回答。我得到了一个错误:“未定义的方法`#的`_delete`”,这是可行的,但它看起来太草率了。是否有一种方法可以添加active admin在更新时向现有资源添加新嵌套资源时所具有的删除按钮?同意。为什么持久化记录的删除按钮没有出现?同意是否有按钮?是的,有人找到了解决方案吗?对于Rails 4,只有在我通过强参数允许时,它才对我有效:
:\u destroy
permit\u params…,嵌套的\u model\u属性:[:\u destroy,]
我忘记了
接受嵌套属性的
上的
允许销毁:true
选项,我认为允许参数足够了,谢谢!其他答案都没有提到这一点。如果需要销毁嵌套属性,则
:\u destroy
参数应位于
嵌套属性
属性中。=>(permit_params:attr,:attr,_attributes:[:attr,:attr,:_destroy]请更具体地回答您的问题。请解释此操作的作用以及代码片段如何回答问题。
has_many :child_name, :dependent => :destroy