2010-01-14 14 views
26

devo percorsi come questo:Redirect radice URL da qualche altra parte in applicazione Rails

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' 

Quello che vorrei ottenere è che dopo aver digitato: www.example.com mi avrebbe reindirizzare www.example. com/it/risconti.

Prima, quando ho usato map.root dall'alto esempio appena stati al www.example.com e reso corretta visione (ma era senza :locale e ha funzionato bene), poi ho aggiunto :locale ai miei percorsi e da questo momento mio punto di vista (che utilizza una forma) non funziona correttamente. Ottengo l'errore che non riesce a trovare il percorso corrispondente per il modulo, il che è giusto, perché non ho superato alcun :locale.

Quindi, come reindirizzare la radice in un'altra pagina? Probabilmente sarà necessario generare percorso corretto e farla passare attraverso http 302. e/o come fare qualcosa di simile:

map.root :controller => 'prepayments/login', :my_locale => 'en' 

EDIT: miei percorsi rake aspetto:

  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 :

Ho provato a farlo nel modo in cui Garrett ha proposto e ha funzionato. Ho cambiato le rotte:

map.redirect '/', :controller => 'prepayments/login', :action => 'welcome' 

e aggiunto il metodo benvenuti nel controllore:

def welcome 
    redirect_to prepayments_root_path(:locale => 'en') 
end 

e funziona come avrei voluto (in modo che i cambiamenti URL nel browser).

L'altro modo è quello di cambiare le rotte in questo modo:

map.root :controller => 'prepayments/login', :locale => 'en' 

Funziona anche, ma non sta riorientando (non cambia URL nel browser). Non sono sicuro se esiste un'opzione come map.redirect. L'ho trovato negli esempi su www ma ho trovato anche plugin che aggiungono tale funzionalità.

Grazie per l'aiuto!

risposta

-4

Sarà necessario impostare il controller a un Welcome o cosa no, poi quando che regolatore viene colpito, si reindirizzerà al percorso che si desidera. Forse il routing di Rails 3 sarà migliore per cose come questa, ma per ora, avrai bisogno di avere un controller di root principale.

+0

Ma come aggiungere questo: parametro locale a redirect_to prepayments_root_path? – klew

+0

So che posso aggiungerlo prima con una stringa, ma c'è un modo migliore? – klew

+0

Puoi dare l'output dei tuoi 'rake routes'? – Garrett

128

In Rails 3 si può scrivere:

root :to => redirect('/prepayments') 

La seguente pagina ha una buona introduzione a fare questi redirect in Rails 3: http://www.railsdispatch.com/posts/rails-routing

+0

Bello! Grazie per l'aiuto! – lesyk

+4

Utilizza un reindirizzamento permanente 301. Come faresti un reindirizzamento temporaneo 302? –

+2

Voglio baciarti! –

34

opzioni di reindirizzamento non sembrano essere troppo documented bene.
qui si va (@derek, vedi ultimo esempio):

reindirizzare a un sottodominio sul dominio del richiesta corrente

root to: redirect(subdomain: 'foo', path: '/bar') # => foo.example.com/bar 

redirect con params sostituiti dal percorso abbinato

get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}') 

reindirizzamento con codice di stato (ad esempio 302 anziché predefinito 301)

redirect(path: '/foo', status: 302) 

redirect con un blocco condizionale

redirect(status: 302) { |params, request| 
    case request.host 
    when 'localhost' 
    '/foo' 
    when /example.com$/ 
    '/bar' 
    else 
    '/baz' 
    end 
} 
+0

Grazie, questo dovrebbe essere accettato –

0

In Rails 4 (4.2.0 nel mio caso), ho aggiunto questo: match "*path" => "main#index", :via => [:get, :post] a app/config/routes.rb.

Per scoprire cosa è necessario inserire al posto di main. Cerca in questo file: app/controllers/main_controller.rb. Anche in questo caso, il tuo non può essere chiamato main_controller.rb, ma sarà something_controller.rb, probabilmente NONapplication_controller.rb o servers_controller.rb. In quel file, vedrete un codice simile a questo:

class MainController < ApplicationController 
    def index 
    render :layout => "angular" 
    end 
end 

Dove c'è MainController, si dovrebbe essere in grado di dire con il messaggio di errore Rails fornisce nel browser che cosa fare da qui . Basta sostituire principale in match "*path" => "main#index", :via => [:get, :post] con qualsiasi sia il prefisso del controller.

Spero che questo abbia senso. Sono un principiante rubino pure

Problemi correlati