2009-09-18 9 views
0

J'ai quelques ressources de rails avec des paramètres complémentaires à l'ID:. Par exemple:Rails ressources générées méthodes url et paramètres

map.resources :users, :controller => 'users', :path_prefix => ':lang' 

Alors que je devais le lang préfixée à l'URL.
Les méthodes par défaut générés url seraient:

user_url(lang, user) 

Cependant, le lang est toujours le même paramètre. Par exemple params [: lang] ou user.lang. Donc je chercherais un moyen propre de définir ce paramètre lang sans le passer dans les paramètres de la méthode user_url.
Jusqu'à présent, j'utilise des aides. Mais redéfinir toutes ces méthodes n'est pas très propre. Et une aide n'est pas valide dans le contrôleur lorsque la méthode user_url doit l'être.

J'ai également essayé de les ajouter à un module lib afin qu'ils soient disponibles dans le contrôleur et dans la vue. Cependant, je vois alors un problème avec rspec. Même si j'inclus la bibliothèque, les méthodes utilisées sont les rails générés par défaut.

Auriez-vous une idée de comment je pourrais éclaircir ça? : P

Répondre

1

Vous pouvez essayer d'utiliser un alias_method_chain (Yehuda dirait probablement qu'il est abusé, bien :)). Ajoutez votre valeur param aux options, puis appelez la méthode d'origine.

+0

Ouais j'aime ça :) –

1

Essayez ceci:

module UserWithLanguageSupport 
    def user_url(user, options = {}) 
    url_for options.reverse_merge({ 
       :id => @user, 
       :lang => params.fetch(:lang, @user.lang) 
      }) 
    end 
end 

class MyController < ActionController::Base 

    include UserWithLanguageSupport 
    helper :all, UserWithLanguageSupport 

end 
+0

Oui, il suffit de réécrire la fonction de route nommée. – ndp

+0

Eh bien, l'ajouter au contrôleur n'est pas une bonne idée;) Mais j'ai essayé de l'ajouter à un module lib que j'inclus dans ApplicationController. Cependant, assez étrangement, la méthode par défaut remplace cela dans RSpec. Donc, mes tests ne se passe pas bien quand ils le devraient. C'est pourquoi j'espérais quelque chose d'un peu mieux. –

+0

Je suis pour les contrôleurs skinny, donc mettre dans un module que votre ApplicationController à la fois inclut et définit comme une aide fonctionne très bien. Cela ne rend pas le contrôleur plus petit, conceptuellement, mais littéralement. –

Questions connexes