Rediriger l'url racine vers un autre endroit dans L'application Rails
j'ai routes, comme ceci:
map.namespace 'prepayments', :path_prefix => '/:locale/prepayments' do |prepayment|
prepayment.root :controller => 'login', :namespace => 'prepayments'
...
end
map.redirect '/', :controller => 'prepayments/login' # this is not working
# I tried also
map.root :controller => 'prepayments/login'
ce que j'aimerais obtenir, c'est qu'après avoir tapé: www.example.com il me redirigerait vers www.example.com/en/prepayments.
plus tôt quand j'ai utilisé map.root
d'après l'exemple ci-dessus, il est juste resté à www.example.com et rendu la vue correcte (mais il était sans :locale
et ça fonctionnait bien), plus tard, j'ai ajouté :locale
à mes routes et à partir de ce moment ma vue (qui utilise une certaine forme) ne fonctionne pas correctement. J'obtiens l'erreur qu'il ne peut pas trouver la route correspondante pour le formulaire - ce qui est juste, parce que je n'ai pas réussi tout :locale
.
alors, comment rediriger root vers une autre page? Il devra probablement générer le chemin correct et le passer par http 302. Ou/Et comment faire quelque chose comme:
map.root :controller => 'prepayments/login', :my_locale => 'en'
modifier: Mon rake routes ressemble à ceci:
prepayments_root /:locale/prepayments {:controller=>"prepayments/login", :action=>"index"}
prepayments_create /:locale/prepayments/send_email {:method=>:post, :controller=>"prepayments/login", :action=>"send_email"}
prepayments_home /:locale/prepayments/home {:controller=>"prepayments/prepayments", :action=>"home"}
prepayments_save /:locale/prepayments/save {:controller=>"prepayments/prepayments", :action=>"save"}
prepayments_agree /:locale/prepayments/agree {:controller=>"prepayments/prepayments", :action=>"agree"}
prepayments_disagree /:locale/prepayments/disagree {:controller=>"prepayments/login", :action=>"logout"}
prepayments_payment /:locale/prepayments/payment {:controller=>"prepayments/prepayments", :action=>"payment"}
prepayments_payment_email /:locale/prepayments/payment_email {:controller=>"prepayments/prepayments", :action=>"payment_email"}
/:locale/prepayments/:uid {:controller=>"prepayments/login", :action=>"verify"}
redirect / {:controller=>"prepayments/login", :action=>"index"}
EDIT:
j'ai essayé de le faire comme Garrett l'a proposé et ça a marché. J'ai changé les routes:
map.redirect '/', :controller => 'prepayments/login', :action => 'welcome'
et a ajouté bienvenue méthode de contrôleur:
def welcome
redirect_to prepayments_root_path(:locale => 'en')
end
Et ça fonctionne comme je le voulais (si il change l'url dans mon navigateur).
L'autre façon est de changer de route comme ceci:
map.root :controller => 'prepayments/login', :locale => 'en'
il fonctionne aussi, mais il ne redirige pas (il ne change pas d'url dans le navigateur). Je ne suis pas sûr qu'il y ait une telle option comme map.redirect
. Je l'ai trouvé dans des exemples sur www mais j'ai aussi trouvé plugin qui ajoutent une telle fonctionnalité.
Merci pour votre aide!
4 réponses
vous devrez configurer le contrôleur à un Welcome
ou ce n'est pas, puis quand le contrôleur est activé, il redirige vers la route que vous voulez. Peut-être que le routage de Rails 3 sera mieux pour ce genre de choses, mais pour l'instant, vous aurez besoin d'un contrôleur racine principal.
dans les Rails 3 vous pouvez écrire:
root :to => redirect('/prepayments')
La page suivante vous donne une bonne introduction pour faire ces redirections dans Rails 3: http://www.railsdispatch.com/posts/rails-routing
options de redirection ne semble pas être documentée trop bien.
voici (@derek, voir dernier exemple):
rediriger vers un sous-domaine sur le domaine de la requête courante
root to: redirect(subdomain: 'foo', path: '/bar') # => foo.example.com/bar
redirection avec substitués params correspondant à la route
get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
rediriger avec le code d'état (par ex. 302 au lieu de 301)
redirect(path: '/foo', status: 302)
redirection avec un bloc conditionnel
redirect(status: 302) { |params, request|
case request.host
when 'localhost'
'/foo'
when /example.com$/
'/bar'
else
'/baz'
end
}
Dans les Rails 4 (4.2.0 dans mon cas), j'ai ajouté ceci: match "*path" => "main#index", :via => [:get, :post]
app/config/routes.rb
.
Pour savoir ce que vous êtes censé mettre à la place de main
. Rechercher dans ce fichier: app/controllers/main_controller.rb
. Encore une fois, le vôtre ne peut pas être appelé main_controller.rb
, mais il sera something_controller.rb
, probablement application_controller.rb
ou servers_controller.rb
. Dans ce fichier, vous verrez un code qui ressemble à ceci:
class MainController < ApplicationController
def index
render :layout => "angular"
end
end
là Où il est MainController, vous devriez être en mesure de dire par le message d'erreur rails fournit dans votre navigateur quoi faire à partir d'ici. Il suffit de remplacer mainmatch "*path" => "main#index", :via => [:get, :post]
avec n'importe quel préfixe du contrôleur.
Espérons que cela a du sens. Je suis un rubis débutants ainsi