Rails 3 - reject_if proc не перехватывает пустые поля - PullRequest
2 голосов
/ 23 декабря 2011

Я получаю отказ от reject_if.

Модель Item имеет несколько вариантов, причем модель также принимает вложенные атрибуты:

  accepts_nested_attributes_for :variants, :allow_destroy => :true,
  :reject_if => :all_blank

Когда я отправляю, он публикует следующие параметры:

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"66areo4waM82H66771RkUD/Zt3rrp8Hgk/mwOqV42YI=", "item"=>{"name"=>"Dans", "body"=>"adsdsa", "visible"=>"1", "sellable"=>"0", "variants_attributes"=>{"0"=>{"name"=>"", "price"=>"", "qty"=>"", "sku"=>"", "_destroy"=>"false"}}}, "commit"=>"Save Item", "id"=>"6"}

Для справки контроллер:

  def edit
    @item = Item.find(params[:id])
    @item.variants.build

Атрибуты вариантов не заполнены, но они не отклоняются моделью элемента. Таким образом, все проверки проходят, делая невозможным сохранение. Есть идеи?

1 Ответ

3 голосов
/ 23 декабря 2011

Вызов build на ассоциации не имеет ничего общего с reject_if опциями accepts_nested_attributes_for.Вы вызываете build без каких-либо параметров, поэтому он инициализирует вариант со значениями атрибутов по умолчанию.

Использование reject_if имеет значение, когда вы инициализируете или обновляете свою родительскую модель таким образом, когда атрибуты для моделей (вариантов) ассоциации передаются непосредственно в родительскую модель(предмет):

item = Item.new :name => "Dans", :variants_attributes => { "0" => { :name => "" } }

Если reject_if равно false, вы получите новый предмет с одним вариантом, имеющим пустое имя.Если reject_if равно true, этот вариант не будет создан, так как все переданные атрибуты пусты.Но использование этой опции не мешает вам создавать варианты с пустыми атрибутами вручную, используя build или напрямую добавляя варианты к элементу, например:

item.variants << Variant.new

Кстати, почему вы звоните build в вашем edit действие?Обычно edit действие просто выбирает модель и отображает форму.Обновление атрибутов модели происходит в update действии, подобном этому:

@item = Item.find params[:id]
@item.update_attributes params[:item]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...