2011-05-23 1 views
0

NOUVEAU RÉDACTIONProblèmes avec "link_to"

Avec resources :cases dans le routes.rb tous ces assistants de routage fonctionnent comme prévu (c est une instance de l'affaire modèle):

cases_path   # Index action 
new_case_path  # New action 
case_path(c)  # Show action 
edit_case_path(c) # Edit action 

Changer routes.rb à ceci:

scope "/:area" do 
    resources :cases 
end 

deux aides de routage Fail (voir erreur ci-dessous):

cases_path   # OK 
new_case_path  # OK 
case_path(c)  # Fail 
edit_case_path(c) # Fail 

Pour cela fonctionne je fais besoin de changer les deux aides dans:

cases_path         # OK 
new_case_path        # OK 
case_path(c, :area => params[:area])  # OK 
edit_case_path(c, :area => params[:area]) # OK 

Pourquoi il n'y a pas besoin de donner: zone aux deux premières aides et il est nécessaire pour les deux secondes? Il rend le code source de confusion ...

QUESTION ANCIEN

Dans un premier temps j'ai eu cette routes.rb:

resources :cases 

et je pourrais générer des liens de ce type

example.com/cases/3 

pour montrer le cas avec ID = 3 avec:

link_to("Show this case", @case) 

Je modifié routes.rb à:

scope "/:area" do 
    resources :cases 
end 

fin le link_to ci-dessus me donne l'erreur

No route matches {:action=>"show", :controller=>"cases", :area=>#<Case id: 2, 

Il semble que les rails ne soit pas la: zone des paramètres automatiquement. Je pouvais résoudre ce problème forçant la zone créant un lien avec

link_to("Show this case", case_path(params[:area], @item)) 

pour obtenir le lien vers

example.com/area1/cases/3 

mais je ne l'aime pas vraiment. Est-ce que je fais quelque chose de mal? Pourquoi les rails amènent le contrôleur et l'action mais oublient la zone?

Répondre

0

Ajouter cette méthode à votre ApplicationController:

def default_url_options(options={}) 
    {:area => params[:area]} 
end 

Ensuite, vous ne devez pas définir manuellement l'option: zone dans vos aides de routage

+0

Cela a fonctionné, merci! – Lucamug

+0

Cela fonctionne très bien dans la portée, mais la liaison à des routes hors de la portée (par exemple, root_path) inclut un paramètre «? Area = 1» comme paramètre de chaîne de requête (puisque le paramètre n'existe pas dans la route). Comment pouvez-vous supprimer le paramètre lors de la liaison en dehors de la portée? – dsample

1

Essayez cette

link_to "Show this case", [:area, @case] 

EDIT (enlever le côlon)

scope "/area" do 
    resources :cases 
end 

EDIT 2

link_to "Show this case", case_path(@case, :area => :en) 

Si vous avez spécifié area comme argument que vous devriez toujours passer il.

+0

Cela donne l'erreur 'méthode non définie « area_case_path » pour # <# : 0x0000000360cbd0> '. Le point est que je voudrais que Rails utilise la zone: automatiquement. – Lucamug

+0

@Luke, essayez mon édition – fl00r

+0

Le côlon est nécessaire, voir [ici] (http://guides.rubyonrails.org/i18n.html#setting-the-locale-from-the-url-params) – Lucamug