2

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

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

从at调用时,此部分工作正常,但从BiscuitsControllerat调用时/users/1/biscuits它会爆炸- 似乎这里指的是用户而不是饼干集合。NoMethodError in Users#edit undefined method 'user_url' for #<UsersController>UsersController/users/1/editresource_url

无论当前控制器如何,我如何强制资源/集合成为任何资源集合?

有什么更好的方法来做到这一点?

另外,假设我们覆盖UsersController#collectionand ,如果路由调用via #resource,这些方法是否在被调用?还是每个请求只有一个被 Rails 实例化?UsersControllerBiscuitsController/users/1/biscuitsController

4

2 回答 2

1

夹在浅浅的路线上,即:

resources :users, :shallow => true do
  resources :biscuits
end

然后做 rake 路线,看看是否能解决问题

于 2012-03-09T12:35:24.457 回答
1

关于路由行为- 据我所知,如果你想使用嵌套和非嵌套的路由,你真的应该定义它两次。IE

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
应该可以工作。

于 2011-10-25T12:37:59.100 回答