2011-07-29 112 views
5

我有一个看起来像这样的嵌套的模型结构:嵌套表单不显示!

resources :users, :path => '/' do 
    resources :accounts do 
     resources :characters 
    end 
end 

我试图让accounts#new页面同时显示的形式,但由于某些原因,只显示账户形式(screenshot)。

这里的混帐:https://github.com/imjp/d2shed

account.rb

class Account < ActiveRecord::Base 
attr_accessible :account_name, :realm 
accepts_nested_attributes_for :characters 

belongs_to :user 
has_many :characters, :dependent => :destroy 

validates :account_name, :presence => 'true', 
        :length => { :in => 4..20 }, 
        :uniqueness => 'true' 

validates_presence_of :realm 
validates_format_of :account_name, :with => /^[A-Za-z\d_]+$/ 
end 



accounts_controller.rb

def new 
    @user = User.find(params[:user_id]) 
    @account = Account.new 
    @account.characters.build 
end 



_form.html.erb

<%= form_for([@user, @account]) do |f| %> 
<div class="field"> 
<%= f.label :account_name %><br /> 
<%= f.text_field :account_name %> 
</div> 
<div class="field"> 
<%= f.radio_button(:realm, "USWest") %> 
    <%= f.label(:realm, "USWest") %> 

    <%= f.radio_button(:realm, "USEast") %> 
    <%= f.label(:realm, "USEast") %> 

    <%= f.radio_button(:realm, "Europe") %> 
    <%= f.label(:realm, "Europe") %> 

    <%= f.radio_button(:realm, "Asia") %> 
    <%= f.label(:realm, "Asia") %> 
</div>  

<%= f.fields_for :character do |character_form| %> 

     <div class="field"> 
      Name: <%= character_form.text_field :name %> 
     </div> 
    <% end %> 

<div class="actions"> 
<%= f.submit %> 
</div> 
<% end %> 

编辑:代码工作吧!

回答

7

你为什么要这么做fields_for ".."

你想要做什么是<%= f.fields_for :characters %>因为这将遍历所有的字符,如账户的形式呈现所需的字段。通过在f对象上调用fields_for您告诉父窗体它包含嵌套的属性。其次,您需要在表单中使用@account对象,而不是使用@user.accounts.build构建另一个对象。通过这样做这种错误的方式,你实际上是创建一个新的账户对象,它不会有任何预先为其构建的角色对象。

除此之外,您需要在Account模型中指定accepts_nested_attributes_for :characters,以便表单接受它们以及帐户参数。

+0

嘿谢谢回答!我修改了代码,但仍然无法运行:/我编辑了我的问题以更新代码。你可以看看还有什么可能会丢失? – imjp

+0

@imjp:如果你澄清了什么“仍然没有工作”,那么也许是的。 –

+0

@imjp:其实我注意到你在表单中犯了一个错误。在我的答案中的中段可以解决这个错误。 –