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!

28
demandé sur klew 2010-01-14 21:25:53

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.

-4
répondu Garrett 2010-01-14 18:28:23

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

132
répondu Shaun McDonald 2014-02-10 16:48:26

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
}
34
répondu glasz 2013-08-02 12:51:32

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

0
répondu Jeremy 2015-04-14 06:41:28