6

我正在使用 Rails 2.3.2,并试图让嵌套对象表单正常工作。我已将我的问题缩小到 Rails 没有使用启动 accept_nested_attributes_for 处理所需的 *_attributes 设置嵌套表单元素的问题。

我的模型代码是:

class Person < Party
  has_one :name, :class_name => "PersonName"
  accepts_nested_attributes_for :name, :allow_destroy => true
end

class PersonName < ActiveRecord::Base
  belongs_to :person
end

我的视图代码如下所示(我正在使用 HAML):

%h3 New customer
= error_messages_for :person, :person_name, :name, :country

- form_for :person, :url => collection_url, :html => {:class => 'MainForm'} do |person_form|

  - @person.build_name unless @person.name
  - person_form.fields_for :name do |name_form|
    = name_form.label :given_name, "First Name:"
    = name_form.text_field :given_name

    = name_form.label :family_name, "Last Name:"
    = name_form.text_field :family_name

  = hidden_field_tag :inviter_id, params[:inviter_id]
  = hidden_field_tag :inviter_code, params[:inviter_code]
  %p= submit_tag "Create"

= link_to 'Back', collection_url

而不是 params 是:

{"person"=>{"name_attributes"=>{"given_name"=>"Fred", "family_name"=>"Flintstone"}}, ...} 

我得到:

{"person"=>{"name"=>{"given_name"=>"Fred", "family_name"=>"Flintstone"}}, ...} 

结果,我得到了一个 TypeMismatch 异常。我遵循了Ryan Daigle的文档。我也遵循了这个博客complex-forms-example的建议。

使用 Firebug,我浏览了我的表单并将输入标签的名称属性从名称调整为 name_attributes。这产生了具有 name_attributes 的参数,并且创建工作正常。

我被困住了,因为我无法弄清楚为什么我的表单没有生成名称的 *_attributes 形式。

我尝试的另一件事是我让 complex_form_example 在我的环境中工作。我浏览了控制器、模型和视图的每一寸,并将其与我的代码进行了比较。我找不到有什么不同。我知道这是一件小事,如果有任何帮助,我将不胜感激!

谢谢!

4

6 回答 6

4

尝试对 form_for 使用实际对象:

form_for :person => form_for @person
于 2009-04-24T09:58:11.870 回答
4

回帖没有被路由到正确的地方

def new
  @person = Person.new
end

<% form_for @person do |f| %>
    <% f.fields_for :name_attributes do |p| %>
        ...
    <% end %>
<% end %>

回帖被路由到正确的地方

def new
  @person = Person.new
  @person.name = PersonName.new # << this allows fields_for :relation vs :relation_attributes
end

<% form_for @person do |f| %>
    <% f.fields_for :name do |p| %>
        ...
    <% end %>
<% end %>

无需在#create 中再次@person.name

于 2009-07-16T06:50:16.513 回答
1

我刚刚为完全相同的问题苦苦挣扎了大约一个小时!

按照 nowk 的模式在控制器中使用新方法,然后将其放在您的视图中

<% form.fields_for :name, @person.name do |name_form| %>


<% end %>

如果你尝试一下,祝你好运,这对我有用。

于 2009-08-19T16:29:42.473 回答
0

不知道为什么这不起作用,但作为一种解决方法,您可以在 controller#create 方法中使用 params[:name] 来更新人员记录。

person = Person.new(params[:person])
person.name << PersonName.new(params[:name])
于 2009-04-13T17:37:22.733 回答
0

不幸的是,我仍然无法弄清楚为什么这个表单不能用于嵌套对象表单。我将其剥离为最简单的数据,并使用 complex-form-example 作为开始重新开始。我结束了使用 active_presenter 从表单中收集 x 对象数据。我将在表单中的某个时候重新讨论嵌套对象表单。谢谢你的帮助。

于 2009-04-16T16:49:00.763 回答
0

以为我会分享我的解决方案,因为它略有不同 - 在我的情况下,我希望嵌套属性是动态的。

在新动作中:

  case params[:type]
  when "clubber"
    @account = resource.send "build_#{params[:type]}"
  when "promoter"
    @account = resource.send "build_#{params[:type]}"
  when "company"
    @account = resource.send "build_#{params[:type]}"
  when "venue_owner"
    flash[:notice] = 'We ask that venue owners register via the web. Thanks.'
    redirect_to root_path and return
  end

在我看来:

= f.fields_for @account.class.name.downcase+'_attributes' do |form|

漂亮的贫民区,但它的工作原理。

于 2011-09-07T00:55:21.733 回答