получение ошибки массового присваивания для поля, которое не устанавливается - PullRequest
1 голос
/ 23 августа 2011

В Rails 3 есть вложенная форма, которая прекрасно работает при создании.На этапе редактирования я получаю ПРЕДУПРЕЖДЕНИЕ: не могу массово назначить защищенные атрибуты: тип.Форма не должна пытаться установить «тип» и не делает этого, насколько я могу судить по параметрам.

class TagSetNomination < ActiveRecord::Base
  belongs_to :pseud
  belongs_to :owned_tag_set

  has_many :fandom_nominations, :dependent => :destroy
  has_many :character_nominations, :dependent => :destroy
  has_many :relationship_nominations, :dependent => :destroy
  has_many :freeform_nominations, :dependent => :destroy

  accepts_nested_attributes_for :fandom_nominations, :character_nominations, :relationship_nominations, :freeform_nominations, {
    :allow_destroy => true,
    :reject_if => proc { |attrs| attrs[:tagname].blank? }
  }
....
end

Все эти номинационные классы являются подклассами этого базового класса:

class TagNomination < ActiveRecord::Base
  belongs_to :tag_set_nomination

  ....
end

И вот соответствующий бит моей формы:

<%= error_messages_for :tag_set_nomination %>

<%= form_for(@tag_set_nomination, :url => (@tag_set_nomination.new_record? ? tag_set_nominations_path(@tag_set) : tag_set_nomination_path(@tag_set, @tag_set_nomination)), :html => {:method => (@tag_set_nomination.new_record? ? :post : :put)}) do |f| %>

  <h4><%= ts("Tag Nominations") %></h4>
  <fieldset class="tagset">
    <dl>
      <% @tag_set_nomination.character_nominations.each_with_index do |character_nomination, index| %>
        <%= f.fields_for :character_nominations, character_nomination do |nom_form| %>
          <%= render 'tag_nominations', :nom_form => nom_form, :tag_type => 'character', :tag_nominations_counter => index %>
        <% end %>
      <% end %>
    </dl>
  </fieldset>

....
<% end %>

И некоторыенадеюсь, соответствующие биты из журнала:

Started POST "/tag_sets/1/nominations/3" for 68.175.83.208 at 2011-08-23 02:59:08 +0000
Parameters: { ... "tag_set_nomination"=>{"character_nominations_attributes"=>{"0"=>{"tagname"=>"Sam", "parent_tagname"=>"", "tagnotes"=>"", "id"=>"12"}, "1"=>{"tagname"=>"Dean", "parent_tagname"=>"", "tagnotes"=>"", "id"=>"13"}, "2"=>{"tagname"=>"Yarbld", "parent_tagname"=>"Supernatural", "tagnotes"=>"some notes", "id"=>"16"}} ... }

SQL (0.1ms)  SELECT COUNT(*) FROM `tag_nominations` WHERE `tag_nominations`.`type` = 'CharacterNomination' AND (`tag_nominations`.tag_set_nomination_id = 3)
...
SQL (0.2ms)  ROLLBACK
Pseud Load (0.2ms)  SELECT `pseuds`.* FROM `pseuds` WHERE (`pseuds`.user_id = 8)
CharacterNomination Load (0.3ms)  SELECT `tag_nominations`.* FROM `tag_nominations` WHERE `tag_nominations`.`type` = 'CharacterNomination' AND (`tag_nominations`.tag_set_nomination_id = 3)
WARNING: Can't mass-assign protected attributes: type
WARNING: Can't mass-assign protected attributes: type
WARNING: Can't mass-assign protected attributes: type

А потом я получаю дамп обратно для редактирования без ошибок на странице.D:

Любые идеи приветствуются!Я сбит с толку.

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Хорошо, я понял это, вздох. Это было связано с любым кодом, который я вставил. У меня был обратный вызов before_save, который устанавливал значение в true или false - и, конечно, когда он возвращал false, обратный вызов before_save прекращался, и поэтому сохранение было откатано.

Facepalm

1 голос
/ 23 августа 2011

Можете ли вы сделать ваше type поле attr_accessible в вашей модели?

Я нашел 2 ссылки, которые могут помочь:

http://somethinglearned.com/articles/2006/05/24/best-practices-a-strong-case-for-attr_accessible-part-2

http://api.rubyonrails.org/classes/ActiveRecord/MultiparameterAssignmentErrors.html

Надеюсь, это поможет!

...