ActiveAdmin嵌套表单不起作用

时间:2015-03-16 13:18:57

标签: ruby-on-rails activeadmin

我在rails应用程序中使用ActiveAdmin。我的设置如下:

应用程序/模型/ translation_type.rb

class TranslationType < ActiveRecord::Base
    has_many :translation_details
    accepts_nested_attributes_for :translation_details, allow_destroy: true
end

应用程序/模型/ translation_detail.rb

class TranslationDetail < ActiveRecord::Base
  belongs_to :translation_type
  attr_accessor :id, :language_from, :language_to, :price
end

应用程序/管理/ translation_type.rb

ActiveAdmin.register TranslationType do
  permit_params :translation_type, translation_details_attributes: [:id, :language_from, :language_to, :price, :_destroy]

  index do
    column :translation_type
    column :translation_details
    column :created_at
    column :updated_at
    actions
  end

  filter :translation_type
  filter :created_at

  form do |f|
    f.inputs "Translation Type Details" do
      f.input :translation_type
      f.input :created_at
      f.input :updated_at
    end
    f.inputs do
      f.has_many :translation_details, allow_destroy: true do |tran_det|
        tran_det.input :language_from, :collection => ['Gr', 'En', 'Fr', 'De']
        tran_det.input :language_to, :collection => ['Gr', 'En', 'Fr', 'De']
        tran_det.input :price
      end
    end
    f.actions
  end

  controller do
    before_filter { @page_title = :translation_type } 
  end

我不需要translation_detail的某个部分,所以我省略了app/admin/translation_detail.rb

我希望在translation_detail表单中嵌套translation_type形式。使用上面的代码创建嵌套表单但在提交后不会保存translation_detail的属性。此外,当我尝试更新或删除translation_detail时,会显示此消息

Couldn't find TranslationDetail with ID=* for TranslationType with ID=*

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

似乎这一行

attr_accessor :id, :language_from, :language_to, :price
app/models/translation_detail.rb中的

导致错误,但我不确定原因。

答案 1 :(得分:0)

我在保存以前未保存且数据库中不存在的字段时遇到了同样的问题。我必须从模型文件中删除 attr_accessor :fieldName 以使其永久化。

正如此 answers 所述:attr_accessor on Rails 仅在您不希望将属性保存到数据库中时才使用,仅作为该模型实例的一部分临时存储。

问题示例中可能发生的情况是它无法保存 TranslationDetail,因为除了它与 TranslationType 的关系之外的所有内容在保存之前都被丢弃了。