【问题标题】:Redirect root url to somewhere else in Rails application将根 url 重定向到 Rails 应用程序中的其他位置
【发布时间】:2011-01-05 04:59:38
【问题描述】:

我有这样的路线:

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'

编辑: 我的 rake 路线如下所示:

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

编辑:

我尝试按照 Garrett 提议的方式进行操作,并且成功了。我改变了路线:

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 上的示例中找到了它,但我也找到了添加此类功能的插件。

感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails redirect routes root


    【解决方案1】:

    在 Rails 3 中,您可以编写:

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

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

    【讨论】:

    • 这使用 301 永久重定向。您将如何进行 302 临时重定向?
    • 我和@DerekDahmer 在一起!您如何从 routes.rb 执行 302。我尝试传入状态:302,但没有任何乐趣。
    • 你能看看这个答案是否有用吗? stackoverflow.com/a/19138779/99266
    • guides.rubyonrails.org/routing.html#redirection 要进行临时 (302) 重定向,只需在重定向指令中添加 status: 302get '/stories/:name', to: redirect('/articles/%{name}', status: 302)
    【解决方案2】:

    重定向选项似乎不太适合documented
    给你(@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
    }
    

    【讨论】:

      【解决方案3】:

      在 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.rbservers_controller.rb。在该文件中,您会看到一些如下所示的代码:

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

      哪里有MainController,你应该可以通过rails在你的浏览器中提供的错误信息告诉你从这里做什么。只需将 match "*path" =&gt; "main#index", :via =&gt; [:get, :post] 中的 main 替换为控制器的前缀即可。

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

      【讨论】:

        【解决方案4】:

        您需要将控制器设置为Welcome 或不设置,然后当 控制器被击中时,它将重定向到您想要的路线。也许 Rails 3 路由会更适合这样的东西,但现在,你需要一个主根控制器。

        【讨论】:

        • 但是如何将此 :locale 参数添加到 redirect_to prepayments_root_path ?
        • 我知道我之前可以用一些字符串添加它,但是有更好的方法吗?
        • 你能给出你的rake routes的输出吗?
        • 过时的答案。 @glasz 是最完整和最新的。
        猜你喜欢
        • 2018-08-01
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 1970-01-01
        相关资源
        最近更新 更多