ruby-on-rails - 嵌套资源问题

Posted

技术标签:

【中文标题】ruby-on-rails - 嵌套资源问题【英文标题】:ruby-on-rails - Problem with Nested Resources 【发布时间】:2011-05-25 09:11:16 【问题描述】:

我对嵌套资源有疑问。

2 个模型

User => has_many :stuffs

Stuff => belongs_to :user

routes.rb

map.resources :stuffs

map.resources :users, :has_many => [:stuffs]

当我调用 /users/1/stuffs 时,它会向我显示相应用户的 Stuff。但是当我调用 /users/2/stuffs 时我也得到了这个。它应该返回 0 个“Stuffs”,但它不起作用。

mysql Query from Server
SELECT * FROM `stuffs`

搜索路线

stuffs GET    /stuffs(.:format)                         :action=>"index", :controller=>"stuffs"
                POST   /stuffs(.:format)                         :action=>"create", :controller=>"stuffs"
      new_stuff GET    /stuffs/new(.:format)                     :action=>"new", :controller=>"stuffs"
     edit_stuff GET    /stuffs/:id/edit(.:format)                :action=>"edit", :controller=>"stuffs"
          stuff GET    /stuffs/:id(.:format)                     :action=>"show", :controller=>"stuffs"
                PUT    /stuffs/:id(.:format)                     :action=>"update", :controller=>"stuffs"
                DELETE /stuffs/:id(.:format)                     :action=>"destroy", :controller=>"stuffs"
    user_stuffs GET    /users/:user_id/stuffs(.:format)          :action=>"index", :controller=>"stuffs"
                POST   /users/:user_id/stuffs(.:format)          :action=>"create", :controller=>"stuffs"
 new_user_stuff GET    /users/:user_id/stuffs/new(.:format)      :action=>"new", :controller=>"stuffs"
edit_user_stuff GET    /users/:user_id/stuffs/:id/edit(.:format) :action=>"edit", :controller=>"stuffs"
     user_stuff GET    /users/:user_id/stuffs/:id(.:format)      :action=>"show", :controller=>"stuffs"
                PUT    /users/:user_id/stuffs/:id(.:format)      :action=>"update", :controller=>"stuffs"
                DELETE /users/:user_id/stuffs/:id(.:format)      :action=>"destroy", :controller=>"stuffs"
          users GET    /users(.:format)                          :action=>"index", :controller=>"users"
                POST   /users(.:format)                          :action=>"create", :controller=>"users"
       new_user GET    /users/new(.:format)                      :action=>"new", :controller=>"users"
      edit_user GET    /users/:id/edit(.:format)                 :action=>"edit", :controller=>"users"
           user GET    /users/:id(.:format)                      :action=>"show", :controller=>"users"
                PUT    /users/:id(.:format)                      :action=>"update", :controller=>"users"
                DELETE /users/:id(.:format)                      :action=>"destroy", :controller=>"users"
           root        /                                         :action=>"index", :controller=>"users"

宝石清单

actionmailer (2.3.8)
actionpack (2.3.8)
activerecord (2.3.8)
activeresource (2.3.8)
activesupport (2.3.8)
arel (2.0.6)
authlogic (2.1.6)
builder (2.1.2)
cgi_multipart_eof_fix (2.5.0)
gem_plugin (0.2.3)
i18n (0.5.0)
mongrel (1.1.5 x86-mingw32)
mysql (2.8.1 x86-mingw32)
paperclip (2.3.7)
rack (1.1.0)
rails (2.3.8)
rake (0.8.7)
tzinfo (0.3.23)

对应的 user_id 没有 where 子句。但是如何解决呢?

Rails 版本 2.3.8

应该像这样工作 => http://guides.rubyonrails.org/routing.html 2.7 嵌套资源

希望有人能帮忙

【问题讨论】:

【参考方案1】:

在你的 Stuffs 控制器的 index 方法中,你是如何收集你的东西的?如果您使用脚手架创建控制器,它将默认为类似

@stuffs = Stuff.all

但应该类似于

@user = User.find(params[:user_id])
@stuffs = @user.stuffs

或者类似的东西——基本上,你是在收集用户的东西,而不是所有的东西。

【讨论】:

嗯,我可以这样做,但我认为 rails 会参与这部分,当我在 routes.rb 中添加 :has_many 关系时。我也想用你的代码调用 /stuffs/ 它会抛出一个错误:( 如果要列出 /stuffs/ 上的所有 Stuff 以及 /user/:user_id/stuffs 上的用户 Stuff,则必须检查 user_id 参数。本质上,如果设置了 params[:user_id],则使用获取用户内容的代码,否则获取所有内容。 我认为 rails 会自动处理这个问题。喜欢这里 => railscasts.com/episodes/139-nested-resources @Nihil 如果您点击完整源代码的链接,您可以看到他加载过滤集合的位置:github.com/ryanb/railscasts-episodes/blob/master/episode-139/…【参考方案2】:

单独的路线不会影响模型。但是,由于传入了用户 ID,您可以这样做:

User.find(params[:user_id]).stuffs

【讨论】:

嗯,但它应该可以工作,这就是问题所在 :( 另请参阅:guides.rubyonrails.org/routing.html 2.7 嵌套资源 不,只会影响 url 路由。当你得到对象的集合时,你仍然需要自己通过嵌套的 id 来过滤它。该指南不作任何声明。【参考方案3】:

试试这个

map.resources :users do |users|
  users.resources :stuffs
end

【讨论】:

不工作 :( 与 routes.rb 中的 :has_many 选项相同的问题 所以控制器有问题...检查上述答案【参考方案4】:

Rails 控制器默认不会过滤您的结果。如上所述,由于您可能在 StuffsController 中调用了 Stuff.all,因此它将始终返回所有 Stuff 对象。

我使用inherited_resources 作为我网站上的默认行为。它会自动处理这些关系,并允许您在需要不同行为时覆盖它:

https://github.com/josevalim/inherited_resources

【讨论】:

以上是关于ruby-on-rails - 嵌套资源问题的主要内容,如果未能解决你的问题,请参考以下文章

Ruby-on-Rails:多个 has_many :通过可能吗?

让 Ruby-on-Rails 6/Webpack + Bootstrap 一起正常工作的问题

Ruby-on-Rails 3.2:导出包含大型数据集(100,000 条记录)的 CSV

如何在 Ruby-on-Rails 中生成 PDF 表单

Ruby-on-Rails 显示问题 - 2018 年 5 月仅存在一次,但我的应用程序显示了 7 次

ubuntu中ruby-on-rails的安装