2010-09-29 5 views
2

désolé pour mon anglais,rubis sur des rails d'aide personnalisée setter

J'ai un modèle nommé Recipe et la recette a un attribut nommé duration

Dans ma forme, je 2 listes déroulantes pour obtenir attribut durée

select_tag 'duration[hours]' 
select_tag 'duration[minutes]' 

J'ai besoin de la valeur de l'attribut de durée comme ce format hh:mm:ss

J'ai essayé avec

def duration=(d) 
    self.duration = "#{d[:hours]}:#{d[:minutes]}:00" 
end 

mais qui ne fonctionne pas

aide s'il vous plaît

Thk dans le conseil!

+2

lorsque vous dites "ne fonctionne pas", qu'est-ce que cela signifie? Y a-t-il un message d'erreur ou le code reste-t-il assis toute la journée à refuser de trouver un emploi? – Gareth

Répondre

7

Avec

def duration=(d) 
    self.duration = "#{d[:hours]}:#{d[:minutes]}:00" 
end 

Dans votre méthode, vous vous appelez parce que c'est la même méthode. Vous devez modifier les attributs durée non la méthode

def duration=(d) 
    write_attribute(:duration, "#{d[:hours]}:#{d[:minutes]}:00") 
end 
+0

write_attribute est obsolète depuis un certain temps: http://apidock.com/rails/ActiveRecord/Base/write_attribute – SooDesuNe

+0

... bien, peut-être pas: http://api.rubyonrails.org/ classes/ActiveRecord/Base.html – SooDesuNe

0

Vos éléments de formulaire sont nommés hours et minutes mais votre modèle recherche les clés h et m?

Est-ce vraiment ce que vous voulez dire?

+0

Désolé, je l'ai édité –

0

Ok, je l'ai résolu

select_tag 'custom_duration[hours]' 
select_tag 'custom_duration[minutes]' 

J'ai créé une méthode setter avec un nom que diferent attribut pour définir mon attribut

def custom_duration=(d) 
    self.duration = "#{d[:hours]}:#{d[:minutes]}:00" 
end 

THK quelque manière que ce

Cordialement.

4

Voici la syntaxe correcte que vous recherchez:

Dans la vue (recettes/_form.html.erb ...)

select_tag 'duration[hours]' 
select_tag 'duration[minutes]' 

Dans le modèle (recipe.rb ...)

def duration=(d) 
    write_attribute(:duration, "#{d[:hours]}:#{d[:minutes]}:00") 
end 

pour être complet, pour remplacer le getter

def duration 
    read_attribute(:duration) 
end 

Vous pouvez également utiliser:

self[:duration] = "#{d[:hours]}:#{d[:minutes]}:00" 
self[:duration] 

Mais pas:

self.duration = "#{d[:hours]}:#{d[:minutes]}:00" 
self.duration 

En passant par soi-même.name appellera les fonctions getter ou setter (que vous essayez de surcharger)

Questions connexes