Не удается сохранить вложенный атрибут в Rails - PullRequest
1 голос
/ 14 декабря 2010

Rails новичок здесь. В моем приложении я пытаюсь создать базу данных игр, каждая из которых имеет несколько MameControls как вложенные атрибуты. Поля для ввода MameControls отображаются в новом представлении, но не в редактировании, результаты не отображаются в Show, и если я validate_presence_of: mameControls, он не сохранит форму, заявив, что «элементы управления Mame не могут быть пустыми». И в консоли rails Game.first (или последняя, ​​или любая другая запись) .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

Ответы [ 3 ]

1 голос
/ 14 декабря 2010

Хорошо, выясняется, что проблема заключалась в том, что я использовал reject_if в accepts_nested_attributes_for.Прежде всего, я проверял неправильное имя переменной (смущающий) и неправильно понимал, что на самом деле делает метод, а точнее не делает - если ранее заполненная запись отклоняется из-за того, что она пуста (как в этой лямбде), она выигралаt удалить или обнулить соответствующее значение индекса в массиве.Это просто ничего не сделает с этим.Вы должны явно установить запись вложенного атрибута в _destroy, чтобы уничтожить.Я прочитал accepts_nested_attributes_for с теоретической точки зрения, но я должен был лучше понять его варианты.

0 голосов
/ 09 августа 2011

У меня была похожая проблема. Я получил правильное отображение вложенной формы, но когда я отправил форму, она записала информацию о родительском объекте в базу данных, но не дочерний (вложенный) объект.

Решением для меня было добавление следующего кода в мой (как если бы я использовал ваш пример) метод create в 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.

0 голосов
/ 14 декабря 2010

Попробуйте добавить :mame_controls_attributes к attr_accessible и затем создать запись. Затем при редактировании записи в окне редактирования также должны отображаться поля для mame_controls.

Кроме того, почему элементы управления должны быть видны в действии шоу? (шоу предназначено для отображения данных, а не для их редактирования)

...