尝试做一些非常简单的事 - 有人可以提供正确的咒语吗?
基本上我们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)
从BiscuitsController
/users/1/biscuits
调用时,此部分工作正常,但在NoMethodError in Users#edit undefined method 'user_url' for #<UsersController>
UsersController
调用/users/1/edit
时,它会被resource_url
炸弹 - 似乎UsersController#collection
在这里指的是用户而不是饼干集合。
无论当前的控制器是什么,我怎么能强制资源/集合成为任何资源集合?
更好的方法是什么?
另外,假设我们覆盖#resource
和UsersController
,如果路由通过BiscuitsController
调用/users/1/biscuits
,则调用Controller
上的这些方法吗?或者每个请求只有一个{{1}}由Rails实例化?
答案 0 :(得分:1)
- 据我所知,如果你想使用嵌套和非嵌套的路由,你真的应该定义它两次。即。
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)
当访问BiscuitsController#index时,@ user为nil 应该工作。
答案 1 :(得分:1)
在一条浅薄的路上躲开,那就是:
resources :users, :shallow => true do
resources :biscuits
end
然后做rake路线,看看是否有诀窍