2009-05-10 7 views
2

(Attention: Clueless Rails Débutant)Je ne sais pas où (modèle ou contrôleur) pour définir ma méthode de recherche

Dans mon show.html.erb pour mes albums voir, j'appelle une méthode publique dans mon contrôleur albums:

<% albums_feature = find_albums_with_feature(feature.id) %> 

Il génère un NoMethodError.

Je copié la méthode dans mon modèle album et essayé appeler de la vue comme:

<% albums_feature = Album.find_albums_with_feature(feature.id) %> 

Mais cela devient aussi un NoMethodError.

Où devrais-je définir cette méthode?

Pour ce que ça vaut, la méthode ressemble à ceci:

def find_albums_with_feature(feature_id) 
    albums_for_feature = Albums.find_by_sql( 
    ["select al.* from albums al, albums_features alfe 
    where al.id = alfe.album_id 
    and alfe.feature_id = ?", feature_id]) 
    end 

Répondre

6

Si vous voulez avoir la méthode qui est accesible de la vue, vous avez quelques options:

  • mettre dans le modèle
  • mettre dans l'aide
  • le mettre dans le contrôleur et ajouter une ligne « helper_method: find_albums_with_feature »

Mais je pense que vous pouvez le faire meilleur. Premièrement, ne mettez aucune méthode de recherche en vue. Mettez-le dans le contrôleur. Deuxièmement, vous n'avez pas besoin de spécifier votre propre méthode de recherche. Vous avez probablement quelque chose comme ceci dans vos modèles:

class Album << ActiveRecord::Base 
    has_many :albums_features 
    has_many :features, :through => :albums_features 
end 

class AlbumsFeature << ActiveRecord::Base 
    belongs_to :album 
    belongs_to :feature 
end 

class Feature << ActiveRecord::Base 
    has_many :albums_features 
    has_many :albums, :through => :albums_features 
end 

Avec elle, vous pouvez trouver des albums avec fonction spécifique comme ceci:

@feature = Feature.find(id) 
@albums = @feature.albums 

ou

@albums = Feature.find(id).albums 

et il devrait être en votre contrôleur. Dans la vue, vous devriez seulement afficher les résultats. Si vous recherchez plus d'informations sur les associations, regardez ici: http://guides.rubyonrails.org/association_basics.html. Je pense que c'est le meilleur endroit où tu peux apprendre sur Rails - du moins c'est pour moi.

+0

Wow. Terrifiant. Merci. –

2

Dans le modèle album. A besoin de soi en face si:

def self.find_albums_with_feature(feature_id) 
+0

Pourquoi a-t-il besoin de soi? En Ruby, vous n'avez habituellement pas besoin de 'soi'? Quoi qu'il en soit, après avoir suivi votre suggestion, j'ai obtenu: "constante non initialisée Album :: Albums" quand j'ai appelé Album.find_albums_with_feature (feature.id) dans la vue. Avais-je besoin d'autre chose? –

+0

Si vous le mettez dans le modèle, supprimer "Albums". de "Albums.find ... and_so_on". – klew

+0

La partie auto est l'objet pour lequel la méthode est utilisée. Ainsi, à partir d'un contrôleur, vous utilisez Album.method, mais lorsque vous appelez la méthode à partir de son propre modèle, vous utilisez self.method. Aussi: la réponse de klew est probablement la façon dont vous voulez aller. Il est important dans Ruby de traiter tout comme son propre objet avec ses propres méthodes, avec des associations appropriées. – Jarrod

Questions connexes