Rails ActiveAdmin嵌套表单has_one accepts_attributes_for formtastic问题

27

我正在使用ActiveAdmin和Rails 3.1--我遇到了一个问题,无法确定以下是一个bug还是有一种正确的方法可以实现,我可能没有理解。我试图使用具有has_one关系的嵌套模型,这样我就可以在一个步骤中创建页面并填写其元数据。(page has_one meta_data, accepts_nested_attributes_for meta_data)

例子1) 在这个例子中,当我点击新页面时,元数据部分是存在的,但没有输入字段--而且,如果我编辑记录,它会正确显示,但fieldset会在第二个部分中重复出现...如果我删除f.inputs包装semantic_field_for(这是有意义的),那么它将完全破坏,并且在元数据区域中不显示任何内容...

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个回答

62

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

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
谢谢,这正是我一直在寻找却无法在其他地方找到的! - thrice801
1
我希望这对我起作用。表单已经构建好了,但在 <li> 中没有嵌套隐藏值的 HTML。Formtastic 2.2.1。 - Trip
2
这是我所做的:= f.inputs "Registered Course", :for => [:registered_courses, f.object.new_record? ? RegisteredCourse.new : f.object.registered_courses] do |registered_course_form| = registered_course_form.input :enterprise_registration_id, input_html: { value: registration.id }, as: :hidden 我需要使用new_record?因为它是HABTM,因此空数组仍然是一个值。 - Trip

26
在Rails 4中,这是可以工作的,并且具有良好的设计。 例如,一个客户有一个账户。 模型/customer.rb
accepts_nested_attributes_for :account

管理员/客户.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

6
这个方法很好用,但是不必通过覆盖控制器方法来允许所有属性,你可以像这样做:permit_params :user, :name, account_attributes: [:active, :subscription, ...]。这对我很有效! - Alex Kovshovik
4
不要忘记同时允许:id参数,否则您将无法进行更新(会创建一条新的记录)。请参考设置Strong Parameters - akira

1

我曾经有同样的问题,我使用了您的技巧并使其正常工作。 然后,我将<% @page.build_meta_data %> 移动到一个类似以下的自定义新方法中

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

希望这能帮到你


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接