web-dev-qa-db-fra.com

Rediriger l'URL racine vers un autre emplacement dans l'application Rails

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!

31
klew

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

139
Shaun McDonald

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
}
35
glasz

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

0
Jeremy