Перенаправить корневой 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/en/prepayments.

Раньше, когда я использовал map.root из приведенного выше примера, он просто оставался на www.example.com и отображал правильный вид (но он был без :locale и работал хорошо), позже я добавил :locale к своим маршрутам, и с этого времени мой вид (который использует некоторые форма) не работает должным образом. Я получаю сообщение об ошибке, что он не может найти соответствующий маршрут для формы - и это правильно, потому что я не прошел ни одного :locale.

Итак, как перенаправить корень на другую страницу? Вероятно, потребуется сгенерировать правильный путь и передать его через http 302. Или/и как сделать что-то вроде:

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

РЕДАКТИРОВАТЬ: Мои рейк-маршруты выглядят так:

         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"}

РЕДАКТИРОВАТЬ:

Я попробовал сделать так, как предложил Гаррет, и это сработало. Я изменил маршруты:

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, но я также нашел плагин, который добавляет такую ​​​​функциональность.

Спасибо за помощь!


person klew    schedule 14.01.2010    source источник


Ответы (4)


Вам нужно будет установить контроллер на Welcome или что-то еще, тогда, когда этот контроллер нажат, он перенаправит на нужный вам маршрут. Возможно, маршрутизация Rails 3 будет лучше для таких вещей, но сейчас вам понадобится главный корневой контроллер.

person Garrett    schedule 14.01.2010
comment
Но как добавить этот параметр :locale в redirect_to prepayments_root_path ? - person klew; 14.01.2010
comment
Я знаю, что могу добавить его с помощью строки раньше, но есть ли более приятный способ? - person klew; 14.01.2010
comment
Можете ли вы дать результат вашего rake routes? - person Garrett; 14.01.2010
comment
Устаревший ответ. @glasz — самый полный и актуальный. - person Lloeki; 26.11.2013

В Rails 3 вы можете написать:

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

На следующей странице есть хорошее введение в выполнение этих перенаправлений в Rails 3: http://www.railsdispatch.com/posts/rails-routing

person Shaun McDonald    schedule 02.09.2011
comment
Здесь используется постоянный редирект 301. Как бы вы сделали временную переадресацию 302? - person Derek Dahmer; 22.07.2013
comment
Я с @DerekDahmer! Как вы делаете 302 из route.rb. Пробовал передать статус: 302, но без радости. - person Tom Rossi; 02.10.2013
comment
Можете ли вы увидеть, поможет ли этот ответ? stackoverflow.com/a/19138779/99266 - person Shaun McDonald; 20.12.2013
comment
guides.rubyonrails.org/routing.html#redirection Чтобы выполнить временную операцию (302) перенаправление, просто добавьте status: 302 к директиве перенаправления: get '/stories/:name', to: redirect('/articles/%{name}', status: 302) - person Richard Peck; 30.12.2016

параметры перенаправления не кажутся задокументировано слишком хорошо.
вот, пожалуйста (@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
}
person glasz    schedule 02.08.2013

В Rails 4 (в моем случае 4.2.0) я добавил это: match "*path" => "main#index", :via => [:get, :post] в 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, вы сможете сказать по сообщению об ошибке, которое rails предоставляет вашему браузеру, что делать дальше. Просто замените main в match "*path" => "main#index", :via => [:get, :post] любым префиксом контроллера.

Надеюсь, это имеет смысл. Я тоже новичок в рубине

person Jeremy    schedule 14.04.2015