1

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

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
4

3 回答 3

1

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

于 2010-12-14T15:50:52.403 回答
0

尝试添加:mame_controls_attributes然后attr_accessible创建记录。然后,当您编辑记录时,编辑视图还应显示mame_controls.

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

于 2010-12-14T01:45:30.167 回答
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。

于 2011-08-08T21:17:51.523 回答