新编辑
routes.rb
resources :cases
后,所有这些路由帮助程序都按预期工作(c 是模型案例的实例):
cases_path # Index action
new_case_path # New action
case_path(c) # Show action
edit_case_path(c) # Edit action
将routes.rb
更改为:
scope "/:area" do
resources :cases
end
两个路由帮助程序失败(请参阅下面的错误):
cases_path # OK
new_case_path # OK
case_path(c) # Fail
edit_case_path(c) # Fail
要使其正常工作,我需要更改最后两个助手:
cases_path # OK
new_case_path # OK
case_path(c, :area => params[:area]) # OK
edit_case_path(c, :area => params[:area]) # OK
为什么不需要给前两个助手:area,而需要后两个?它使代码混乱...
老问题
最初我有这个routes.rb:
resources :cases
我可以生成这种类型的链接
example.com/cases/3
以显示 ID = 3 的情况,如下所示:
link_to("Show this case", @case)
然后我将routes.rb修改为:
scope "/:area" do
resources :cases
end
结束上面的link_to给我错误
No route matches {:action=>"show", :controller=>"cases", :area=>#<Case id: 2,
似乎轨道不会自动从参数中获取 :area。我可以解决这个问题,强制该区域创建链接
link_to("Show this case", case_path(params[:area], @item))
获取链接
example.com/area1/cases/3
但我真的不喜欢它。我做错了什么吗?为什么导轨带来了控制器和动作,却忘记了该区域?
试试这个
link_to "Show this case", [:area, @case]
编辑(删除冒号)
scope "/area" do
resources :cases
end
编辑 2
link_to "Show this case", case_path(@case, :area => :en)
如果将area
指定为参数,则应始终传递它。
将此方法添加到应用程序控制器:
def default_url_options(options={})
{:area => params[:area]}
end
然后,您不必在路由帮助程序中手动设置 :area 选项