想做一些非常简单的事情——谁能提供正确的咒语?
基本上我们有Biscuit
可选地嵌套在User
中所以我们想要这样的路由:
/biscuits
/biscuits/1
/users/2/biscuits
/users/2/biscuits/3
等。
我们有像biscuits/index
这样的视图,它调用部分biscuits/_index
来渲染列表。我想从用户的配置文件视图users/edit
调用相同的部分,但我不清楚使用哪个resource_url帮助器:
resources :users do
resources :biscuits
end
class BiscuitsController < InheritedResources::Base
belongs_to :user, optional: true
end
用户/edit.html.haml: = render 'biscuits/index', biscuits: @user.biscuits.all
饼干/_index.html.haml:
- biscuits.each do |biscuit|
%tr
%td= biscuit.title
%td= link_to image_tag(biscuit.file_url(:thumb,:large)), resource_url(biscuit)
%td
= link_to 'Show', resource_url(biscuit)
|
%td
= link_to 'Edit', edit_resource_url(biscuit)
这个部分在/users/1/biscuits
从BiscuitsController
调用时工作得很好,但是在/users/1/edit
从UsersController
调用时NoMethodError in Users#edit undefined method 'user_url' for #<UsersController>
就爆炸了——似乎resource_url
指的是这里的用户而不是饼干集合。
我如何强制资源/集合为任何资源集合,而不管当前控制器是什么?
有什么更好的方法?
另外,假设我们覆盖UsersController#collection
和#resource
,如果路由通过/users/1/biscuits
调用BiscuitsController
, UsersController
上的这些方法是否被调用?或者每个请求只有一个Controller
被Rails实例化?
关于路由行为——据我所知,如果你想使用嵌套和非嵌套的路由,你真的应该定义它两次。例如
resources :users do
resources :biscuits
end
resources :biscuits
也就是说,只有在没有必要不嵌套访问资源时,才认为嵌套资源是更好的做法。如果你只留下饼干的非嵌套路由,它可能解决你的问题。
关于resource_url -你对resource_url和集合方法的引用表明你正在使用插件或gem,如果不知道你正在使用什么插件,很难知道出了什么问题,特别是因为它似乎是你问题的根源。
沿着
的行替换"resource_url"作为帮助器def nested_resource_path(*args)
args = args.compact
return args[0] if args.size == 1
return args
end
被称为:
nested_resource_path(@user, biscuit) and
nested_resource_path(:edit, @user, biscuit)
,其中@user是nil时访问饼干控制器#index
应该工作。
卡盘在一条浅路,即:
resources :users, :shallow => true do
resources :biscuits
end
然后耙路由,看看是否奏效