2010-12-14 68 views
1

Rails newb在这里。在我的应用程序中,我试图创建一个游戏数据库,每个游戏都有多个MameControls作为嵌套属性。用于输入MameControls的字段显示在New视图中,但不在Edit中,结果不显示在Show中,并且如果我validate_presence_of:mameControls它不会保存表单,说明“Mame控件不能为空”。在Rails控制台中,Game.first(或最后或其他任何记录).mame_controls仅返回[]。所以据我所知,嵌套属性并没有被保存,尽管我很确定我已经把所有东西都设置成类似于Railscast#196中显示的内容。下面是游戏类:无法在Rails中保存嵌套属性

class Game < ActiveRecord::Base 
    has_many :mame_controls, :dependent => :destroy 

    attr_accessible :name, :year, :company, :designer, :genre, 
    :sb_info, :wiki_link, :arcade_history_link, :arcade_museum_link, 
    :caesar_link, :wildcard_link, :mame_controls 

    accepts_nested_attributes_for :mame_controls, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true 

    validates_presence_of :name, :year, :company, :genre, :sb_info, :mame_controls 

end 

mame_control.rb:

class MameControl < ActiveRecord::Base 
    belongs_to :game 

    attr_accessible :name, :game_action 
end 

表单代码,进入或编辑MameControls是这样的。

在_form.html.erb

<% f.fields_for :mame_controls do |builder| %> 
    <%= render "control_fields", :f => builder %> 
<% end %> 

_control_fields.html.erb:

<div class="field"> 
<p> 
    <%= f.label :name, "Mame Control Name" %><br /> 
    <%= f.text_field :name %><br /> 
    <%= f.label :game_action, "Game Action" %><br /> 
    <%= f.text_field :game_action %> 
</p> 
</div> 

在games_controller.rb:

def new 
    @game = Game.new 
    5.times do 
     mame_control = @game.mame_controls.build 
    end 
    end 

def create 
    @game = Game.new(params[:game]) 
end 

回答

1

好的,事实证明,这个问题是我在accepts_nested_attributes_for中使用reject_if时出现的一些问题。首先,我正在检查错误的变量名称(令人尴尬),并且我误解了方法实际上在做什么,或者没有这样做 - 如果以前填充的条目因为空白而被拒绝(如在该lambda中),它会赢得'删除或清空数组中相应的索引值。它只是不会做任何事情。您必须显式设置嵌套属性记录为_destroy才能销毁。我从理论角度阅读了accepts_nested_attributes_for,但我应该更好地理解它的选择。

0

尝试增加:mame_controls_attributesattr_accessible,然后创造记录。然后,当您编辑记录时,编辑视图还应显示mame_controls的字段。

此外,为什么控件在show action中可见? (显示是为了显示数据,而不是编辑它)

+0

谢谢,但我恐怕添加:mame_controls_attributes attr_accessible没有任何区别。别担心,这些控件不在演出中。我的意思是简单地说数据不会显示在那里(作为静态信息)。对不起,我不清楚,我已经修复了原来的帖子。 – user541269 2010-12-14 14:26:50

0

我遇到了类似的问题。我得到了正确显示嵌套表单,但是当我提交表单时,它将父对象信息写入数据库,但不是子对象(嵌套)。

对我来说是添加以下代码到我的(好像我是用你的例子)在games_controller.rb

def create 
    @game = Game.new(params[:game]) 
    if @game.save 
    @game.mame_control = MameControl.new(params[:mame_control]) 
    ... 

创建方法还请大家注意,我的父对象有与HAS_ONE关系的解决方案孩子,而不是has_many。