2009-10-28 8 views
1

J'ai une méthode sur une classe d'enregistrement active qui rend un modèle ERB pour un système de messagerie. Le code simplifié ressemble à ceci:Utilisation de rails nommés itinéraires dans les modèles ERB personnalisés

ERB.new(template).result(binding) 

binding est le courant de reliure de l'objet modèle ActiveRecord et template est un fichier modèle de erb lu à partir du système de fichiers.

Je voudrais utiliser des routes nommées dans le modèle, mais n'ont pas été en mesure de rendre les routes nommées disponibles.

J'ai vu les messages sur tout en indiquant à include/require diverses combinaisons des éléments suivants dans le modèle ActiveRecord courant (ou, de préférence comme un singleton):

include ActionView::Helpers::TagHelper 
include ActionView::Helpers::AssetTagHelper 
include ActionController::UrlWriter 
require 'action_controller/routing' 
include ActionController::Routing 
include ActionController::Routing::Routes 
include ActionController::Routing::NamedRoutes 

Certaines de ces erreurs et je pense ne sont pas correct du tout ... d'autres dont je ne vois aucun avantage puisque les routes ne fonctionnent toujours pas. est-ce que quelqu'un a une idée?

Répondre

0

Essayez « inclure ApplicationController »

+0

ApplicationController est une classe donc elle ne peut pas être incluse, cela fait partie du problème avec certaines de mes instructions initiales dans la question. – johnml

0

Je pense que vous vous approchez de ce dans le mauvais sens. MVC consiste à séparer les modèles des vues et des contrôleurs. Vous essayez d'accorder à votre modèle l'accès à la vue, ce qui ne devrait pas être fait dans Rails.

Cela soulève la question, pourquoi? Sauf si vous prévoyez de stocker le modèle rendu dans votre modèle, vous vous y trompez. Même alors, il y a de meilleures façons de le faire.

Comme un appel à rendre: partiel dans le contrôleur au moment de la création/mise à jour.

Y compris toutes ces classes supplémentaires vont encombrer votre modèle.

+0

La situation que vous décrivez n'est pas exactement ce que nous faisons. Il est vrai que nous pourrions casser cela dans une configuration légèrement différente avec une certaine classe de type de contrôleur entre le modèle et le rendu, mais pour le moment cela ne semble pas nécessaire. Ce que nous faisons est de donner un accès personnalisé à la vue/rendu aux méthodes d'affichage des applications et des rails. De même, les méthodes n'ont pas besoin d'être incluses dans le modèle dans son ensemble, uniquement lorsque la méthode contenant 'ERB.new' est appelée. Ceci est généralement effectué en arrière-plan, pas au milieu de chaque requête Web. – johnml

1

J'ai tous les itinéraires nommés et les aides de balise dans la liaison à l'aide:

class << self 
    include LegacyUrlsHelper #a proprietary module 
    include ActionView::Helpers::TagHelper 
    include ActionView::Helpers::AssetTagHelper 
    include ActionView::Helpers::UrlHelper 
    include ActionController::UrlWriter 
end 

La question ne peut établirons default_url_options [:], hôte que j'ai encore à tester.

0

Vous avez vraiment besoin:

 
include ActionView::Helpers::UrlHelper 
include ActionController::UrlWriter 

Vous aurez également besoin de mettre default_url_options[:host] si vous essayez d'utiliser des méthodes _url ou url_for tout au lieu de simplement _path.