我有这样的路线:
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
且效果很好),后来我添加了{{1我的路线,从这时起我的观点(使用某种形式)不能正常工作。我收到错误,它无法找到相应的表单路由 - 这是正确的,因为我没有通过任何:locale
。
那么,如何将root重定向到另一个页面?它可能需要生成正确的路径并通过http 302传递它。 或/和如何制作类似的东西:
:locale
编辑: 我的佣金路线如下:
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"}
并在控制器中添加了welcome方法:
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'
这样的选项。我在www上的示例中找到了它,但我也找到了添加此类功能的插件。
感谢您的帮助!
答案 0 :(得分:137)
在Rails 3中,你可以写:
root :to => redirect('/prepayments')
以下页面详细介绍了在Rails 3中执行这些重定向:http://www.railsdispatch.com/posts/rails-routing
答案 1 :(得分:35)
重定向选项似乎不是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
}
答案 2 :(得分:0)
在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在浏览器中提供了从这里开始的操作。只需将match "*path" => "main#index", :via => [:get, :post]
中的 main 替换为控制器的前缀即可。
希望这是有道理的。我也是红宝石初学者
答案 3 :(得分:-5)
您需要将控制器设置为Welcome
或不是,然后当 控制器被命中时,它将重定向到您想要的路径。也许Rails 3路由对于这样的东西会更好,但是现在,你需要有一个主根控制器。