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



想做一些非常简单的事情——谁能提供正确的咒语?

基本上我们有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)

这个部分在/users/1/biscuitsBiscuitsController调用时工作得很好,但是在/users/1/editUsersController调用时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

然后耙路由,看看是否奏效

相关内容

  • 没有找到相关文章