1

Railsnewbはこちら。私のアプリでは、それぞれがネストされた属性として複数のMameControlsを持つゲームのデータベースを作成しようとしています。MameControlsを入力するためのフィールドは、[新規]ビューには表示されますが、[編集]には表示されません。結果は[表示]に表示されません。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_ifましたaccepts_nested_attributes_for。まず最初に、間違った変数名(困惑)をチェックしていましたが、メソッドが実際に何をしているのか、あるいは何をしていないのかを誤解していました-以前に入力されたエントリが空白であるために拒否された場合(そのラムダのように)、 t配列内の対応するインデックス値を削除またはnullにします。何もしません。_destroy破棄するには、ネストされた属性レコードを明示的に設定する必要があります。私は理論的な観点から読み上げていましたaccepts_nested_attributes_forが、そのオプションをよりよく理解する必要がありました。

于 2010-12-14T15:50:52.403 に答える
0

私も同様の問題を経験していました。ネストされたフォームを正しく表示しましたが、フォームを送信すると、親オブジェクト情報がデータベースに書き込まれましたが、子(ネストされた)オブジェクトは書き込まれませんでした。

私にとっての解決策は、games_controller.rbのcreateメソッドに次のコードを追加することでした(あなたの例を使用しているかのように)

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

また、私の親オブジェクトは、has_manyではなく、子とhas_oneの関係を持っていたことにも注意してください。

于 2011-08-08T21:17:51.523 に答える
0

レコードに追加:mame_controls_attributesしてから作成してみてください。attr_accessible次に、レコードを編集すると、編集ビューにのフィールドも表示されmame_controlsます。

また、show actionでコントロールを表示する必要があるのはなぜですか?(showはデータを表示するためのものであり、編集するためのものではありません)

于 2010-12-14T01:45:30.167 に答える