rails ActiveAdmin嵌套表单has_one accepts_attributes_for formtastic issue

时间:2011-11-16 22:49:51

标签: ruby-on-rails ruby-on-rails-3 formtastic nested-attributes activeadmin

我正在使用ActiveAdmin和Rails 3.1 - 在了解以下是否是一个错误,或者是否有某种方法正确地执行它我不理解时遇到问题。我试图使用具有一个关系的嵌套模型,这样我就可以创建一个页面并在一步中填写它的元数据。 - (页面has_one meta_data,accepts_nested_attributes_for meta_data)

示例1) 在这个例子中,当我点击新页面时,元数据部分就在那里,但没有输入字段 - 如果我编辑记录,它也会正确显示,但是字段集在第二部分重复...并且如果我删除包含semantic_field_for的f.inputs(这是有意义的),然后它完全中断并在元数据区域中没有显示任何内容......

form do |f|
  f.inputs "Page Information" do
    f.input :name
    f.input :uri
    f.input :view
    f.input :body, :as => :text
    f.input :active
  end

  f.inputs "Meta Data" do
    f.semantic_fields_for :meta_data do |meta_form|
      meta_form.inputs :title, :description, :keywords, :name => "Meta Information"
    end
  end  
end

我理解元数据可能没有被实例化,但我不确定我应该如何在表单块中执行此操作? (或者,如果我甚至可以这样做) - 我能够使其工作的唯一方法是使用自定义表单,并在视图中构建元数据,如下所示

2)我如何解决这个问题,但看起来很骇客

<%= semantic_form_for [:admin, @page] do |f| %>
  <% @page.build_meta_data %>
  <%= f.inputs :name => "Page Information" do  %>
    <%= f.input :name %>
    <%= f.input :uri %>
    <%= f.input :view %>
    <%= f.input :body, :as => :text %>
    <%= f.input :active %>
  <% end %>
  <%= f.semantic_fields_for :meta_data do |meta_form| %>
    <%= meta_form.inputs :title, :description, :keywords, :name => "Meta Information" %>
  <% end %>

  <%= f.buttons %>
<% end %>

提前感谢您的任何帮助或澄清。

(请注意,对于主持人我开始了另一个线程,但不是很清楚,我现在还没有解决方法,所以如果其中一个问题应该删除,请删除另一个)

3 个答案:

答案 0 :(得分:56)

我为您找到了更好的解决方案。您可以在:for帮助程序中使用inputs选项。

f.inputs "Meta Data", for: [:meta_data, f.object.meta_data || MetaData.new] do |meta_form|
  meta_form.input :title
  meta_form.input :description
  meta_form.input :keywords
end

我认为这也可能有效,但我没有检查

f.inputs :title, :desctiption, :keywords, 
  name: "Meta Data",
  for: [:meta_data, f.object.meta_data || MetaData.new]

答案 1 :(得分:22)

在rails 4中,这是一个有效的设计

如,   客户有一个帐户

<强>模型/ customer.rb

accepts_nested_attributes_for :account

系统管理员/ customer.rb

form do |f|
  f.inputs do
    f.input :user, input_html: { disabled: true }
      f.input :name
      f.input :address
      f.input :city
      f.input :country, as: :string
    end
    f.buttons

    f.inputs "Account Information", for: [:account, f.object.account] do |s|
      s.input :active, as: :boolean
      s.input :subscription, as: :boolean
      s.input :expires_on, as: :datepicker

      s.actions
    end
  end

  controller do
    def permitted_params
      params.permit!
    end
  end
end

答案 2 :(得分:1)

我遇到了同样的问题,我在你的黑客中工作并让它运转起来。 然后我将<% @page.build_meta_data %>移动到这样的自定义新方法

  controller do
    def new
      @tenant = Tenant.new
      @tenant.build_tenant_configurable
    end
  end

希望这会有所帮助