2010-03-29 5 views
3

j'ai le code suivant dans mon modèle:Rails ActiveRecord :: MultiparameterAssignmentErrors

attr_accessor :expiry_date 
validates_presence_of :expiry_date, :on  => :create, :message => "can't be blank" 

et ce qui suit à mon avis:

<%= date_select :account, :expiry_date, :discard_day => true, :start_year => Time.now.year, :end_year => Time.now.year + 15, :order => [:month, :year] %> 

Cependant, lorsque je soumets ma forme j'obtenir:

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' 

Des idées sur ce que pourrait être le problème? J'ai regardé #93277 sans joie, donc je suis coincé. L'ajout d'un jour à la sélection ne résout PAS le problème. En fin de compte, ce que j'essaie d'obtenir est une propriété du modèle qui n'est pas enregistrée dans la base de données, mais qui est validée. Cela semble déjà fonctionner pour d'autres champs de chaîne simples dans le même modèle, mais pas le: expiry_date

Des idées?

+0

Peut-être que ce SO aidera: http://stackoverflow.com/questions/2541786/rails-activerecordmultiparameterassignmenterrors –

+0

Avez-vous essayez de supprimer attr_accessor? – scottd

+0

@Johnathan - vous avez lié à ma propre question. Cela peut aider, mais j'en doute.) –

Répondre

0

Si vous utilisez attr_accessor, cela signifie que vous ne stockez pas ce champ dans la base de données. Le problème persiste dans le fait que vous ne pouvez pas utiliser un attribut de modèle non persistant (c'est-à-dire: pas réellement stocké dans la base de données via le modèle) avec des aides. C'est pourquoi Rails 3 a ActiveModel: pour utiliser n'importe quel objet, inclure un comportement ActiveModel (via l'inclusion de module), et l'utiliser avec les helpers d'ActionPack (si j'ai bien compris :)).

Essayez de remplacer attr_accessor par attr_accessible ou même de supprimer cette ligne si vous souhaitez protéger ce champ de l'affectation de masse.

J'espère que ça aide.

1

Selon Rails https://github.com/rails/rails/blob/v3.0.4/activerecord/lib/active_record/base.rb#L1764, Rails demandera à la classe quel est le type de cette colonne. Puisque cet attribut n'est pas une colonne, nous aurons zéro, et nil n'a pas de méthode klass. Donc, j'ai juste patché column_for_attribute. Je mets cela dans ma classe (mon attribut était 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

une manière plus courte et plus propre de faire ceci est la suivante (dans le contexte de la classe): 'columns_hash [" birth_date "] = ActiveRecord :: ConnectionAdapters :: Column.new ("birth_date", nil, "date") ' – gerrit

+0

Beaucoup mieux, en effet. Je vous remercie! – pkoch

Questions connexes