Redireccionar URL raíz a algún otro sitio en aplicación Rails
-
20-09-2019 - |
Pregunta
Tengo rutas como esta:
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'
Lo que me gustaría conseguir es que después de escribir: www.example.com sería mi redirigir a www.example.com/en/prepayments
. A principios de cuando solía map.root
desde arriba ejemplo, sólo se quedó en www.example.com y rindió punto de vista correcto (pero era sin :locale
y funcionó bien), más tarde añadí :locale
a mis rutas y desde este momento mi punto de vista ( que utiliza alguna forma) no funciona correctamente. Me sale error que no puede encontrar la ruta correspondiente a la forma - que es justo, porque no pasa ningún :locale
Por lo tanto, la forma de redirigir la raíz a otra página? Probablemente tendrá que generar ruta correcta y pasarlo a través de HTTP 302. O / y cómo hacer algo como:
map.root :controller => 'prepayments/login', :my_locale => 'en'
EDIT: Mis rutas rastrillo se ve así:
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:
He intentado hacer de la manera Garrett propuso y funcionó. He cambiado rutas:
map.redirect '/', :controller => 'prepayments/login', :action => 'welcome'
y añadido método de bienvenida en el controlador:
def welcome
redirect_to prepayments_root_path(:locale => 'en')
end
Además, funciona como quería (por lo que cambiar URL en el navegador).
La otra forma es cambiar rutas como esta:
map.root :controller => 'prepayments/login', :locale => 'en'
También funciona, pero no está redirigiendo (que no cambia url en el navegador). No estoy seguro de si hay opción como map.redirect
. Lo encontré en ejemplos sobre www pero también me encontré plugin que añadir esa funcionalidad.
Gracias por la ayuda!
Solución
Usted tendrá que ajustar el controlador a un Welcome
o lo que no, entonces cuando que controlador es golpeado, volverá a dirigir a la ruta que desea. Tal vez Rails 3 enrutamiento será mejor para este tipo de cosas, pero por ahora, tendrá que tener un controlador principal de la raíz.
Otros consejos
En Rails 3 se puede escribir:
root :to => redirect('/prepayments')
La siguiente página tiene una buena introducción a hacer estas redirecciones en Rails 3: http://www.railsdispatch.com/ mensajes / carriles-routing
o redirección no parecen ser documentado muy bien.
aquí tienes (@derek, ver ejemplo anterior):
redirigir a un subdominio en el dominio de la solicitud actual
root to: redirect(subdomain: 'foo', path: '/bar') # => foo.example.com/bar
redirigir con params sustituidos de la ruta emparejado
get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
redirigir con código de estado (por ejemplo. 302 en lugar de defecto 301)
redirect(path: '/foo', status: 302)
redirigir con un bloque condicional
redirect(status: 302) { |params, request|
case request.host
when 'localhost'
'/foo'
when /example.com$/
'/bar'
else
'/baz'
end
}
En los carriles 4 (4.2.0 en mi caso), añadí esto: match "*path" => "main#index", :via => [:get, :post]
a app/config/routes.rb
Para saber lo que se supone que poner en su lugar de main
. Busque en este archivo: app/controllers/main_controller.rb
. Una vez más, el suyo no puede ser llamado main_controller.rb
, pero será something_controller.rb
, probablemente no application_controller.rb
o servers_controller.rb
. En ese archivo, verá un código que se parece a esto:
class MainController < ApplicationController
def index
render :layout => "angular"
end
end
Donde hay MainController , debería ser capaz de decir por el mensaje de error que proporciona los carriles en su navegador qué hacer desde aquí. Basta con sustituir principal en match "*path" => "main#index", :via => [:get, :post]
con lo que el prefijo del controlador es.
Espero que esto tiene sentido. Soy un principiante rubí, así