ruby on rails rails数据库 将根URL重定向到Rails应用程序中的其他位置




ruby on rails orm (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/prepayments。

早些时候,当我使用上面的示例中的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'

并在控制器中添加了welcome方法:

def welcome
  redirect_to prepayments_root_path(:locale => 'en')
end

它按我的意愿工作(所以它在我的浏览器中更改URL)。

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

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

它也有效,但它没有重定向(它不会改变浏览器中的URL)。 我不确定是否有map.redirect这样的选项。 我在www上的示例中找到了它,但我也发现了添加此类功能的插件。

感谢帮助!


Answer #1

在Rails 4(在我的情况下为4.2.0)中,我添加了: match "*path" => "main#index", :via => [:get, :post] app/config/routes.rb 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.rbservers_controller.rb 。 在该文件中,您将看到一些如下所示的代码:

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

在有MainController的地方 ,你应该能够通过错误信息告诉你rails在浏览器中提供了什么。 只需在match "*path" => "main#index", :via => [:get, :post]替换main match "*path" => "main#index", :via => [:get, :post] ,无论控制器的前缀是什么。

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


Answer #2

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



Answer #4

重定向选项似乎没有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
}




root