繁体   English   中英

Rails ActiveRecord :: MultiparameterAssignmentErrors

[英]Rails ActiveRecord::MultiparameterAssignmentErrors

我的模型中有以下代码:

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

有任何想法吗?

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

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

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

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

尝试通过attr_accessible替换attr_accessor ,或者如果要保护该字段不被大规模分配,甚至删除该行。

我希望它有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM