Перенаправить корневой URL-адрес в другое место в приложении 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'
Что бы я хотел получить, так это то, что после ввода: www.example.com он перенаправит меня на www.example.com/ru/prepayments.
Раньше, когда я использовал map.root
из приведенного выше примера, он просто оставался на www.example.com и отображал правильный вид (но он был без :locale
, и он работал хорошо), позже я добавил :locale
к своим маршрутам и с этого времени мой взгляд (который использует некоторую форму) работает неправильно. Я получаю ошибку, что он не может найти соответствующий маршрут для формы - это правильно, потому что я не прошел ни одного :locale
.
Итак, как перенаправить корень на другую страницу? Вероятно, потребуется создать правильный путь и передать его через http 302.
Или/И как сделать что-то вроде:
map.root :controller => 'prepayments/login', :my_locale => 'en'
EDIT:
Мои маршруты рейка выглядят следующим образом:
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:
Я попытался сделать это так, как предложил Гарретт, и это сработало. Я изменил маршруты:
map.redirect '/', :controller => 'prepayments/login', :action => 'welcome'
и добавлен метод приветствия в контроллере:
def welcome
redirect_to prepayments_root_path(:locale => 'en')
end
И он работает так, как я хотел (поэтому он меняет URL-адрес в моем браузере).
Другой способ - изменить маршруты следующим образом:
map.root :controller => 'prepayments/login', :locale => 'en'
Он также работает, но он не перенаправляет (он не изменяет URL-адрес в браузере). Я не уверен, есть ли такой вариант, как map.redirect
. Я нашел его в примерах на www, но я также нашел плагин, который добавляет такую функциональность.
Спасибо за помощь!
Ответы
Ответ 1
Вам нужно будет установить контроллер на Welcome
, а что нет, тогда, когда этот контроллер будет удален, он перенаправит требуемый маршрут. Возможно, маршрутизация Rails 3 будет лучше для таких вещей, но сейчас вам понадобится главный корневой контроллер.
Ответ 2
В Rails 3 вы можете написать:
root :to => redirect('/prepayments')
Следующая страница имеет хорошее представление о выполнении этих переадресаций в Rails 3: http://www.railsdispatch.com/posts/rails-routing
Ответ 3
параметры перенаправления, похоже, не являются документированы.
здесь вы идете (@derek, см. последний пример):
перенаправление на поддомен текущего домена запроса
root to: redirect(subdomain: 'foo', path: '/bar') # => foo.example.com/bar
перенаправить с замененными параметрами из сопоставленного маршрута
get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
перенаправить с кодом состояния (например, 302 вместо значения по умолчанию 301)
redirect(path: '/foo', status: 302)
перенаправить с условным блоком
redirect(status: 302) { |params, request|
case request.host
when 'localhost'
'/foo'
when /example.com$/
'/bar'
else
'/baz'
end
}
Ответ 4
В Rails 4 (4.2.0 в моем случае) я добавил следующее: match "*path" => "main#index", :via => [:get, :post]
to app/config/routes.rb
.
Чтобы узнать, что вы должны положить вместо main
. Посмотрите в этом файле: app/controllers/main_controller.rb
. Опять же, ваш может не называться main_controller.rb
, но он будет something_controller.rb
, возможно НЕ application_controller.rb
или servers_controller.rb
. В этом файле вы увидите код, который выглядит так:
class MainController < ApplicationController
def index
render :layout => "angular"
end
end
Там, где есть MainController, вы должны сообщить сообщение об ошибке, которое рельсы предоставляют в вашем браузере, что делать дальше. Просто замените main в match "*path" => "main#index", :via => [:get, :post]
любым префиксом контроллера.
Надеюсь, это имеет смысл. Я тоже новичок в рубине