将 root url 重定向到 Rails 应用程序中的其他位置

问题描述 投票:0回答:4

我有这样的路线:

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/prepaids。

早些时候,当我使用上面示例中的

map.root
时,它只是停留在 www.example.com 并呈现正确的视图(但它没有
:locale
并且效果很好),后来我将
:locale
添加到我的路线中,并从此开始有时我的观点(使用某种形式)无法正常工作。我收到错误消息,它找不到表单的相应路径 - 这是正确的,因为我没有通过任何
:locale

那么,如何将root重定向到另一个页面呢?它可能需要生成正确的路径并通过 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

它按照我想要的方式工作(因此它更改了我的浏览器中的网址)。

另一种方法是像这样改变路线:

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

它也可以工作,但它不会重定向(它不会更改浏览器中的 url)。我不确定是否有

map.redirect
这样的选项。我在 www 上的示例中找到了它,但我也找到了添加此类功能的插件。

感谢您的帮助!

ruby-on-rails redirect routes root
4个回答
156
投票

在 Rails 3 中你可以这样写:

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

以下页面很好地介绍了如何在 Rails 3 中执行这些重定向:http://www.railsdispatch.com/posts/rails-routing


38
投票

根重定向选项似乎没有记录得很好。 给你(@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 }
    

-1
投票
在 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
,可能是 
NOT application_controller.rb
servers_controller.rb
。在该文件中,您将看到一些如下所示的代码:

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

哪里有

MainController,你应该能够通过rails在浏览器中提供的错误消息来判断从这里该做什么。只需将 match "*path" => "main#index", :via => [:get, :post] 中的 main

 替换为控制器的前缀即可。

希望这是有道理的。我也是红宝石初学者


-8
投票
您需要将控制器设置为

Welcome

或其他什么,然后当点击
that控制器时,它将重定向到您想要的路线。也许 Rails 3 路由对于这样的事情会更好,但现在,您需要有一个主根控制器。

© www.soinside.com 2019 - 2024. All rights reserved.