2010-08-19 4 views
6

Je dois appeler une action à l'intérieur d'un contrôleur à partir d'une méthode à l'intérieur d'un modèle. C'est quelque chose que je fais beaucoup dans d'autres langues (en travaillant avec le framework MVC), cependant, je n'ai jamais vu ça en ruby ​​on rails. L'action ne restitue rien, elle met simplement à jour une variable de session.Rails Modèle à appeler Action du contrôleur

Répondre

5

Ce n'est pas vraiment quelque chose que vous feriez normalement dans le modèle MVC. Votre modèle ne devrait vraiment héberger que la logique métier (et l'accès aux données). Pouvez-vous fournir des informations sur ce que vous essayez d'appeler et pourquoi? Habituellement, quand vous essayez de faire quelque chose comme ça, c'est une odeur que quelque chose n'est pas ce qu'il est censé être.

C'est généralement la façon dont je le vois:

  • Model - ces données sont des objets qui possèdent également des méthodes pour la logique métier
  • Controller - ce sont les actions prises par votre application, ils contrôlent les modèles et leur dire quoi faire, ils contrôlent en vue de lui dire quoi
  • émettre Voir - ce la couche d'interface, il pourrait être dans tout format (html, js, xml), mais il a très peu de logique pour il

Si vous essayez d'appeler quelque chose dans un contrôleur à partir d'un modèle, cela peut vouloir dire qu'il ya trop de contrôle de logique dans votre modèle. Ou, peut-être, vous avez juste une méthode qui pourrait être utilisée partout (c'est une méthode d'aide, et elle n'est en fait pas reliée au modèle et à votre contrôleur). Dans ce cas, vous devriez le mettre dans son propre module dans votre répertoire/lib.

Editer: Oui, les variables de session ne devraient probablement être touchées/mises à jour que dans le contrôleur. Peut-être avez-vous trop de logique de type contrôle dans votre modèle? Peut-être repenser à quel point cette logique est liée au Modèle réel si elle fait réellement partie de l'action du Contrôleur.

+0

le problème est que j'ai un plug-in pour l'authentification et je dois appeler une méthode lorsqu'un utilisateur se connecte via un remember me fonction à l'intérieur du plug-in (qui byp évalue toutes les actions du contrôleur de connexion - si ce n'était pas le cas, je changerais évidemment les données de session ici). La nécessité d'appeler une méthode dans le contrôleur est liée au suivi analytique et pas vraiment à ce que l'utilisateur voit. – scott

0

Si vous voulez appeler l'action du contrôleur (ou d'une session cahange parce session est défini comme @session variable et elle est privée) du modèle que vous devez passer par exemple du contrôleur en tant que param à la méthode du modèle, donc si vous avez besoin modifier session méthode peut être similaire à

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

dans le contrôleur

def something 
    s = Session.new 
    s.change_session(self) 
    ... 
end 
Questions connexes