我的模型中有以下代码:
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
有什么想法吗?
答案 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
,或者如果要保护该字段不被批量分配,请删除该行。
我希望它有所帮助。