Rails ActiveRecord :: MultiparameterAssignmentErrors

时间:2010-03-29 22:49:56

标签: ruby-on-rails ruby

我的模型中有以下代码:

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,所以有点卡住了。

在select中添加日期并不能解决问题。

最终我试图实现的是模型的属性,该属性未保存到数据库,但已经过验证。这似乎适用于同一模型中的其他一些简单字符串字段,而不是:expiry_date

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

根据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

答案 1 :(得分:0)

如果使用attr_accessor,则表示您没有将该字段存储在数据库中。

问题仍然在于您不能使用辅助工具来使用非持久性模型属性(即:实际上不是通过模型存储到数据库中)。

这就是为什么Rails 3有了ActiveModel:使用任何对象,包含一些ActiveModel行为(通过模块包含),并将它与ActionPack的帮助器一起使用(如果我理解的那样好):()。

尝试将attr_accessor替换为attr_accessible,或者如果要保护该字段不被批量分配,请删除该行。

我希望它有所帮助。