J'ai des itinéraires comme celui-ci:
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
de l'exemple ci-dessus, il est resté sur www.example.com et a rendu la vue correcte (mais c'était sans :locale
et ça marchait bien), plus tard j'ai ajouté :locale
à mes itinéraires et à partir de ce moment ma vue (qui utilise une forme) ne fonctionne pas correctement. Je reçois une erreur selon laquelle il ne peut pas trouver l'itinéraire correspondant pour le formulaire - ce qui est vrai, car je n'ai pas passé de :locale
.
Alors, comment rediriger root vers une autre page? Il faudra probablement générer un chemin correct et le passer par http 302. Ou/Et comment faire quelque chose comme:
map.root :controller => 'prepayments/login', :my_locale => 'en'
EDIT: Mes routes de râteau ressemblent à 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"}
ÉDITER:
J'ai essayé de le faire de la manière proposée par Garrett et cela a fonctionné. J'ai changé d'itinéraires:
map.redirect '/', :controller => 'prepayments/login', :action => 'welcome'
et ajout d'une méthode de bienvenue dans le contrôleur:
def welcome
redirect_to prepayments_root_path(:locale => 'en')
end
Et cela fonctionne comme je le voulais (donc ça change l'url dans mon navigateur).
L'autre façon est de changer les itinéraires comme ceci:
map.root :controller => 'prepayments/login', :locale => 'en'
Cela fonctionne également, mais il ne redirige pas (il ne change pas l'URL dans le navigateur). Je ne sais pas s'il existe une option telle que map.redirect
. Je l'ai trouvé dans des exemples sur www mais j'ai aussi trouvé un plugin qui ajoute une telle fonctionnalité.
Merci pour l'aide!
Dans Rails 3, vous pouvez écrire:
root :to => redirect('/prepayments')
La page suivante présente une bonne introduction à ces redirections dans Rails 3: http://www.railsdispatch.com/posts/Rails-routing
les options de redirection ne semblent pas être documentées trop bien.
c'est parti (@derek, voir dernier exemple):
rediriger vers un sous-domaine sur le domaine de la demande actuelle
root to: redirect(subdomain: 'foo', path: '/bar') # => foo.example.com/bar
rediriger avec des paramètres substitués de la route correspondante
get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
rediriger avec le code d'état (par exemple 302 au lieu de 301 par défaut)
redirect(path: '/foo', status: 302)
rediriger avec un bloc conditionnel
redirect(status: 302) { |params, request|
case request.Host
when 'localhost'
'/foo'
when /example.com$/
'/bar'
else
'/baz'
end
}
Dans 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
. Regardez dans ce fichier: app/controllers/main_controller.rb
. Encore une fois, le vôtre ne peut pas être appelé main_controller.rb
, mais ce sera something_controller.rb
, probablement PAS application_controller.rb
ou servers_controller.rb
. Dans ce fichier, vous verrez du code qui ressemble à ceci:
class MainController < ApplicationController
def index
render :layout => "angular"
end
end
Là où il y a MainController, vous devriez pouvoir dire par le message d'erreur que Rails fournit dans votre navigateur ce qu'il faut faire à partir d'ici. Remplacez simplement main dans match "*path" => "main#index", :via => [:get, :post]
avec le préfixe du contrôleur.
J'espère que cela a du sens. Je suis aussi un débutant Ruby