2009-05-10 8 views
2

(Achtung: Clueless Rails Newbie)Nicht sicher, wo (Modell oder Controller) meine Methode find definiert

In meinem show.html.erb für meine Alben sehen, nenne ich eine öffentliche Methode in meinen Alben Controller:

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

Es erzeugt ein NoMethodError. So

I kopiert die Methode in mein Album Modell und versuchte, es aus der Sicht Aufruf wie:

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

Aber das bekommt auch ein NoMethodError.

Wo soll ich diese Methode definieren?

Für was es wert ist, sieht das Verfahren wie folgt aus:

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 

Antwort

6

Wenn Sie Methode haben wollen, die aus Sicht erreichbar ist, können Sie einige Optionen:

  • steckte es in das Modell
  • es im Helfer setzen
  • steckte es in die Steuerung und fügen Sie eine Zeile: denken „helper_method find_albums_with_feature“

Aber ich Sie es tun können besser. Erstens, stellen Sie keine Suchmethoden in Aussicht. Legen Sie es in den Controller. Zweitens müssen Sie keine eigene Suchmethode angeben. Wahrscheinlich haben Sie so etwas wie dies in Ihren Modellen:

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 

Mit ihm können Sie Alben mit bestimmten Funktion wie diese finden:

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

oder

@albums = Feature.find(id).albums 

und es sollte in sein Dein Controller. In Sicht sollten Sie nur Ergebnisse anzeigen.

Wenn Sie mehr Informationen über Assoziationen suchen, schauen Sie hier: http://guides.rubyonrails.org/association_basics.html. Ich denke, es ist der beste Ort, an dem Sie etwas über Rails lernen können - zumindest für mich.

+0

Wow. Großartig. Vielen Dank. –

2

Im Album-Modell. obwohl braucht selbst vor:

def self.find_albums_with_feature(feature_id) 
+0

Warum braucht es "Selbst"? In Ruby brauchst du normalerweise kein Selbst? Wie auch immer, nachdem ich Ihrem Vorschlag gefolgt war, bekam ich: "nicht initialisierte konstante Album :: Alben", als ich Album.find_albums_with_feature (feature.id) aus der Ansicht aufgerufen habe. Brauchte ich noch etwas anderes? –

+0

Wenn Sie es in Modell einfügen, dann entfernen Sie "Alben". aus "Alben.find ... and_so_on". – klew

+0

Der Self-Part ist das Objekt, für das die Methode verwendet wird, also verwenden Sie von einem Controller aus Album.method, aber wenn Sie die Methode in ihrem eigenen Modell aufrufen, verwenden Sie self.method. Auch: klew's Antwort ist wahrscheinlich die Art, wie du gehen willst. In Ruby ist es wichtig, alles als eigenes Objekt mit eigenen Methoden und entsprechenden Assoziationen zu behandeln. – Jarrod

Verwandte Themen