【问题标题】:rails ActiveAdmin nested form has_one accepts_attributes_for formtastic issuerails ActiveAdmin 嵌套表单 has_one accept_attributes_for formtastic 问题
【发布时间】:2011-11-16 22:49:50
【问题描述】:

我正在使用 ActiveAdmin 和 Rails 3.1 - 无法理解以下是否是错误,或者是否有某种我不理解的正确方法。我正在尝试使用具有唯一关系的嵌套模型,以便我可以创建一个页面并在 1 步中填写它的元数据。 -- (页面 has_one meta_data,accepted_nested_attributes_for meta_data)

示例 1) 在此示例中,当我单击新页面时,元数据部分存在,但没有输入字段-此外,如果我编辑记录,它会正确显示,但是字段集在第二部分中重复...如果我删除了 f.inputs 包装语义场_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 %>

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

(版主请注意,我在这个问题上开始了另一个线程,但不是很清楚,也没有我现在做的解决方法,所以如果应该删除其中一个问题,请删除另一个)

【问题讨论】:

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


    【解决方案1】:

    我为您找到了更好的解决方案。您可以在inputs helper 中使用: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]
    

    【讨论】:

    • 谢谢,正是我一直在寻找但在任何地方都找不到的东西!
    • 我希望这对我有用。表单构建,但在 &lt;li&gt; 内部,没有隐藏嵌套值的 html。 Formtastic 2.2.1
    • 这就是我所做的:= f.inputs "Registered Course", :for =&gt; [: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,所以一个空数组仍然是一个值。
    【解决方案2】:

    在 rails 4 中,这是可行的,设计不错

    例如, 一位客户有一个帐户

    model/customer.rb

    accepts_nested_attributes_for :account
    

    admin/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
    

    【讨论】:

    • 这很好用,但不是通过覆盖控制器方法来允许所有属性,您可以执行以下操作: permit_params :user, :name, account_attributes: [:active, :subscription, ...] .这对我有用!
    • 不要忘记也允许 :id 参数,否则您将无法更新(您将创建一条新记录)。见Setting up Strong Parameters
    【解决方案3】:

    我遇到了同样的问题,我在你的 hack 中工作并让它工作。 然后我将&lt;% @page.build_meta_data %&gt; 移动到像这样的自定义新方法

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多