代码之家  ›  专栏  ›  技术社区  ›  Neil Middleton

rails activerecord::多参数分配错误

  •  3
  • Neil Middleton  · 技术社区  · 15 年前

    我的模型中有以下代码:

    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添加day不能解决问题。

    最终,我要实现的是模型的一个属性,它不会保存到数据库中,而是经过验证。对于同一模型中的其他一些简单字符串字段,这似乎已经起作用,只是不适用于:expiry\u date

    有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  0
  •   Franck Verrot    15 年前

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

    问题仍然在于,不能将非持久模型属性(即:不是通过模型实际存储到数据库中)与帮助程序一起使用。

    这就是为什么rails 3拥有activemodel:to使用任何对象,包括一些activemodel行为(通过模块包含),并与actionpack的助手一起使用(如果我完全理解的话:))。

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

    我希望有帮助。

        2
  •  1
  •   pkoch    13 年前

    按照 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
    
    推荐文章