2010-08-19 11 views
6

Ich muss eine Aktion innerhalb eines Controllers von einer Methode innerhalb eines Modells aufrufen. Das ist etwas, das ich viel in einer anderen Sprache mache (wenn ich mit dem MVC-Framework arbeite), aber das habe ich noch nie in Ruby on Rails gesehen. Die Aktion zeigt nichts an, sie aktualisiert lediglich eine Sitzungsvariable.Rails Model zum Aufrufen Controller-Aktion

Antwort

5

Das ist nicht wirklich etwas, was Sie normalerweise im MVC-Muster tun würden. Ihr Modell sollte eigentlich nur Geschäftslogik (und Datenzugriff) enthalten. Können Sie einige Informationen dazu liefern, was Sie anrufen möchten und warum? Normalerweise, wenn Sie versuchen, etwas wie das zu tun, ist es ein Geruch, dass etwas nicht dort ist, wo es sein sollte. Diese

ist in der Regel so, wie ich es sehe:

  • Modell - das sind Datenobjekte, die haben auch Methoden für die Geschäftslogik
  • -Controller - das sind die Aktionen durch Ihre Anwendung genommen, sie kontrollieren die Modelle und ihnen sagen, was zu tun ist sie die Ansicht steuern, es zu sagen, was zu
  • Ansicht emittieren - das ist die Grenzschicht, es in einem beliebigen Format (html, js,sein könntexml), aber es hat sehr wenig Logik es

Wenn Sie versuchen, etwas in einer Steuerung von einem Modell zu nennen, könnte es zu bedeuten, dass es zu viel ist in Ihrem Modell zu steuern Logik.

Oder vielleicht haben Sie gerade eine Methode, die überall verwendet werden könnte (es ist eine Hilfsmethode, und es ist eigentlich unabhängig von dem Modell und Ihrem Controller). In diesem Fall sollten Sie es in ein eigenes Modul im Verzeichnis/lib einfügen.

Edit: Yeah, Sitzungsvariablen sollten wahrscheinlich nur im Controller berührt/aktualisiert werden. Vielleicht haben Sie zu viel Steuerlogik in Ihrem Modell? Vielleicht überdenken Sie, wie eng diese Logik mit dem tatsächlichen Modell zusammenhängt, wenn es tatsächlich Teil der Aktion des Controllers ist.

+0

Das Problem ist, dass ich ein Plugin für die Authentifizierung haben und ich brauche eine Methode aufrufen, wenn ein Benutzer über eine Funktion innerhalb des Plugin erinnere mich anmeldet (was für unsere Gelben Seiten bewertet alle Login-Controller-Aktionen - wenn dies nicht der Fall wäre, würde ich die Sitzungsdaten hier natürlich ändern. Die Notwendigkeit, eine Methode im Controller aufzurufen, hängt mit der analytischen Verfolgung zusammen und nicht wirklich mit dem, was der Benutzer sieht. – scott

0

Wenn Sie Controller-Aktion aufrufen (oder cahange Sitzung, da session als @session Variable definiert ist, und es ist privat) vom Modell sollten Sie Controller-Instanz als param Modell-Methode übergeben, so, wenn Sie bearbeiten session Methode brauchen kann ähnlich sein

def change_session(controller) 
    @ses = controller.send :session 
    //some actions 
end 

in Controller

def something 
    s = Session.new 
    s.change_session(self) 
    ... 
end 
Verwandte Themen