2010-03-29 35 views
3

我已经在我的模型下面的代码:的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

任何想法?

+0

也许这做将有助于:http://stackoverflow.com/questions/2541786/rails-activerecordmultiparameterassignmenterrors – 2010-03-30 00:08:15

+0

你尝试删除attr_accessor? – scottd 2010-03-30 02:47:20

+0

@Johnathan - 你已经链接到我自己的问题。它可能有帮助,但我怀疑它) – 2010-03-30 08:36:10

回答

0

如果您使用attr_accessor,这意味着您不在数据库中存储该字段。

的问题仍然是事实,你不能使用非持久化模型的属性:与助手(即不通过实际的模型存储到DB)。这就是为什么Rails 3有ActiveModel:使用任何对象,包括一些ActiveModel行为(通过模块包含),并将其与ActionPack的助手(如果我理解这一切:))使用它。

尝试用attr_accessible替换attr_accessor,或者如果要保护该字段不受质量分配的影响,甚至可以删除该行。

我希望它有帮助。

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

一个更短,更清洁的方式做到这一点是以下(在类的上下文中):'columns_hash [“birth_date”] = ActiveRecord :: ConnectionAdapters :: Column.new “birth_date”,零,“日期”)' – gerrit 2012-03-09 12:48:36

+0

确实好多了。谢谢! – pkoch 2012-03-13 21:48:06