【问题标题】:Rails Nested resource access problem in resource_controller资源控制器中的Rails嵌套资源访问问题
【发布时间】:2009-06-23 17:20:07
【问题描述】:

我使用 Rails resource_controller 插件。我有一个 ReleasesController,它嵌套在一个 UsersController 和一个 ProjectsController 中。

Resource_controller 在尝试从 User 拉取发布时失败,但从 Project 成功。 User 下的问题是在 Enumerable::Enumerator 类型的对象中找到 Release 结果,而不是 Release。同样的过程在下查找Release 项目导致识别正确的发布实例。

通过 r_c 代码挖掘,我发现了网络方法调用,我在脚本/控制台中复制了问题:

>> Project.first.releases.find 17
=> #<Release id: 17, project_id: 1, name: "FORTEEN", lock_version: 10, deleted_at: nil, created_at: "2009-06-22 17:56:10", updated_at: "2009-06-22 19:48:47">

>> User.first.releases.find 17
=> #<Enumerable::Enumerator:0x599e29c>

当然,在 Enumerable::Enumerator 上使用的任何 Release 方法都会失败。以下是发布方法的定义:

User:
  def projects
    # active is a named_scope on Project
    employer ? employer.projects.active : Project.active
  end

  def releases
    projects.collect { |p| p.releases }.flatten
  end

Project:
  has_many :releases, :dependent => :destroy

我毫无困难地使用 ProjectsControler 中的 User.projects 方法。我怀疑问题在于 User.releases 方法的定义,但感谢有关如何修复的建议。

这是我的路线定义:

  map.resources :projects do |project|
    project.resources :releases, :member => { :restore => :get }
  end

  map.resources :releases, 
                :member => { :restore => :get },
                :except => [ :new, :create ]

  map.resources :users, :member_path => '/:id', :nested_member_path =>
'/:user_id' do |user|
    user.resources :projects
    user.resources :releases, 
                   :member => { :restore => :get }, 
                   :except => [ :new, :create ]
  end

谢谢!博士

【问题讨论】:

  • 如果您显示路线的定义可能会有所帮助。
  • 我要补充一点,我认为具体问题与 User.releases 返回实际数组而不是关联代理有关,我认为这是 r_c 所期望的。
  • 路由定义:map.resources :users, :member_path => '/:id', :nested_member_path => '/:user_id' do |user| user.resources :projects user.resources :releases, :member => { :restore => :get }, :except => [ :new, :create ] end map.resources :projects do |project| project.resources :releases, :member => { :restore => :get } end map.resources :releases, :member => { :restore => :get }, :except => [ :new, :create ]

标签: ruby-on-rails activerecord ruby-on-rails-plugins


【解决方案1】:

我的解决方案是解决返回结构的差异:

  def object
    # @object = end_of_association_chain.find(param) unless param.nil?
    # work-around r_c expectation of parent.releases result = Association proxy
    # use select block to filter out desired object rt. find
    @object ||= collection.select{ |o| o.id == param.to_i }.first unless param.nil?
    @object
  end

不是我的理想,我宁愿能够通过 end_of_associaition_chain.find() 工作而不是覆盖对象方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多