0

新编辑

在所有这些路由助手resources :casesroutes.rb都按预期工作(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,

似乎 rails 不会自动从参数中获取 :area 。我可以解决这个问题,迫使该区域创建一个链接

link_to("Show this case", case_path(params[:area], @item))

获取链接到

example.com/area1/cases/3

但我真的不喜欢它。难道我做错了什么?为什么 Rails 会带来控制器和动作,却忘记了该区域?

4

2 回答 2

1

尝试这个

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为参数,则应始终传递它。

于 2011-05-23T21:59:30.377 回答
0

将此方法添加到您的 ApplicationController:

def default_url_options(options={})
  {:area => params[:area]}
end

然后,您不必在路由助手中手动设置 :area 选项

于 2011-05-24T14:46:11.097 回答