2011-05-31 9 views
0
I have a method find_all_media in model abc.rb. Model xyz and abc has relationship, 
abc :has_many xyzs and 
xyz :belongs_to abc 



# abc.rb 

method is in abc model 
def self.find_all_media(media_name) 

    if self.media_name == self.xyz.media_name 
    return media_name 
    end 
end 

### view file 
<% @abc.xyzs.each do |xyz| %> 
<tr> 
<td><%=h xyz.media_name %></td> 
<td><%=h xyz.type %></td> 
<td>I want to call method find all_media here ?? </td> 
</tr> 


I tried but not working, any 

Répondre

1

On dirait que votre

def self.find_all_media(media_name) 

    if self.media_name == self.xyz.media_name 
    return media_name 
    end 
end 

méthode est une méthode de classe (auto). Donc, vous essayez d'accéder à vous méthode de classe de votre instance de classe

@abc 

Vous avez deux options

1 - Faire la méthode une méthode d'instance (en supprimant le « soi »)

2 - appelez votre méthode comme Abc.find_all_media

Et tout comme une meilleure pratique,

ne pas appeler directement les modèles de votre point de vue, Faites-le par le contrôleur, ou aide

et si votre méthode 'find_all_media' est someting à voir avec la requête de base de données compte

:scope (in rails 3.x) (named_scope in rails 2.x) 

HTH

sameera

+0

Merci Sameera. Pouvez-vous s'il vous plaît dire pourquoi nous utilisons l'auto? Ma question peut être résolue sans utiliser soi-même. Quand nous devrions utiliser la méthode de classe et la méthode d'instance. – user659068

+0

hi @ user659068, Basic is Si votre méthode effectue une action commune sur tous les modèles use class method (Thats why find est une méthode de classe ActiveRecord Ex. User.find) et quand vous voulez faire quelque chose de spécifique à un utilisateur de modèle donné méthode d'instance (Ex get_amount) cette méthode fera en sorte que les objets actuels se chiffrent à @ use1.get_amount sera 10 et @ user2.get_amount aura 20, HTH sameera – sameera207

+0

vérifiez-les http://railstips.org/blog/archives/2009/ 05/11/class-et-instance-methods-in-ruby/http://www.rubyfleebie.com/understanding-class-methods-in-ruby/ – sameera207

0

Utilisez Abc.find_all_media. Si vous utilisez self dans le nom de la méthode, cela signifie que cette méthode va être utilisée avec le modèle lui-même, pas avec l'objet. Espérons que ça vous aidera

+0

Dans contrôleur Xyz/@xyz = Abc.find_all_mediae (media_name) Je reçois une variable locale non définie ou une méthode 'media_name'? – user659068