使用可选的belongs_to /嵌套继承资源呈现多态部分(Rails 3.1)

时间:2011-08-23 08:47:52

标签: nested ruby-on-rails-3.1 partial inherited-resources

尝试做一些非常简单的事 - 有人可以提供正确的咒语吗?

基本上我们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)
        &nbsp;|&nbsp;
      %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在这里指的是用户而不是饼干集合。

无论当前的控制器是什么,我怎么能强制资源/集合成为任何资源集合?

更好的方法是什么?

另外,假设我们覆盖#resourceUsersController,如果路由通过BiscuitsController调用/users/1/biscuits,则调用Controller上的这些方法吗?或者每个请求只有一个{{1}}由Rails实例化?

2 个答案:

答案 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路线,看看是否有诀窍