2010-10-22 9 views
0

J'ai un modèle, appelé Book, qui a les champs title et filename (et d'autres champs mais sans rapport). Je voudrais que le champ filename a été créé automatiquement en utilisant le titre, donc dans mon Book.rb:Rails: Mise à jour simultanée de deux champs d'une instance ActiveRecord

class Book < ActiveRecord::Base 
    # ... 

    def title=(title) 
    self.filename = sanitize_filename(title) 
    self.title = title 
    end 

    # ... 
end 

En raison de self.title = title ça va dans une récursion infinie. Comment pourrais-je éviter cela?

Merci!

Répondre

1

Essayez cette façon

class Book 
    def title=(title) 
    self.filename = sanitize_filename(title) 
    self[:title] = title 
    end 
end 
+0

Exactement ce que j'ai cherché. J'ai vu la même idée en Python. Merci beaucoup! Je me demande comment j'ai pu programmer sans le savoir ... Merci encore! –

2

Vous pouvez écrire que sur before_save

def before_save 
    self.filename = sanitize_filename(self.title) 
end 
+0

Merci! Je pensais à cela aussi, mais je voulais une solution différente. –

1

Il y a une section dans le ActiveRecord api sur 'accesseurs par défaut d'écraser. La solution suggérée est:

def title=(t) 
    self.filename = sanitize_filename(t) 
    write_attribute(:title, t) 
end 
+0

Je cherchais exactement cette partie de la doc, mais je pensais que quelqu'un pourrait déjà le savoir afin qu'ils puissent m'aider. Merci beaucoup! –