Rails ActiveRecord :: MultiparameterAssignmentErrors - PullRequest
3 голосов
/ 30 марта 2010

В моей модели есть следующий код:

attr_accessor :expiry_date
validates_presence_of :expiry_date, :on        => :create, :message => "can't be blank"

и следующее на мой взгляд:

<%= date_select :account, :expiry_date, :discard_day => true, :start_year => Time.now.year, :end_year => Time.now.year + 15, :order => [:month, :year]  %>

Однако, когда я отправляю свою форму, я получаю:

ActiveRecord::MultiparameterAssignmentErrors in SignupController#create

/Users/x/.rvm/gems/ruby-1.8.6-p383/gems/activerecord-2.3.5/lib/active_record/base.rb:3073:in `execute_callstack_for_multiparameter_attributes'
/Users/x/.rvm/gems/ruby-1.8.6-p383/gems/activerecord-2.3.5/lib/active_record/base.rb:3028:in `assign_multiparameter_attributes'
/Users/x/.rvm/gems/ruby-1.8.6-p383/gems/activerecord-2.3.5/lib/active_record/base.rb:2750:in `attributes='
/Users/x/.rvm/gems/ruby-1.8.6-p383/gems/activerecord-2.3.5/lib/active_record/base.rb:2438:in `initialize'

Есть идеи, в чем может быть проблема? Я смотрел на # 93277 без радости, так что я немного застрял.

Добавление дня в список избранных НЕ решает проблему.

В конечном итоге я пытаюсь получить свойство модели, которая не сохраняется в базе данных, но проверяется. Похоже, это уже работает для некоторых других простых строковых полей в той же модели, но не для: expiry_date

Есть идеи?

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Согласно https://github.com/rails/rails/blob/v3.0.4/activerecord/lib/active_record/base.rb#L1764, Rails спросит класс, какой тип для этого столбца. Поскольку этот атрибут не является столбцом, мы получим nil, а nil не имеет метода klass. Итак, я только что исправил column_for_attribute. Я положил это в моем классе (мой атрибут birth_date):

def column_for_attribute_with_birth_date(name)
  if name == 'birth_date'
    return Object.new.tap do |o|
      def o.klass
        Date
      end
    end
  end
  column_for_attribute_without_birth_date(name)
end
alias_method_chain :column_for_attribute, :birth_date
0 голосов
/ 30 марта 2010

Если вы используете attr_accessor, это означает, что вы не сохраняете это поле в БД.

Проблема заключается в том, что вы не можете использовать непостоянный атрибут модели (т. Е. Фактически не сохраненный в БД через модель) с помощниками.

Вот почему в Rails 3 есть ActiveModel: использовать любой объект, включать некоторое поведение ActiveModel (через включение модуля) и использовать его с помощниками ActionPack (если я все хорошо понял:)).

Попробуйте заменить attr_accessor на attr_accessible или даже отбросить эту строку, если хотите защитить это поле от массового присвоения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...