如何加载和查找多态关联的ID?

时间:2014-04-23 16:16:41

标签: ruby-on-rails ruby ruby-on-rails-4

我使用的是Rails 4.0.2。我有3个型号。妈妈,爸爸和跟随。跟随是多态的,可以属于妈妈或爸爸。

class Dad < ActiveRecord::Base
  has_many :follows, as: :followable
end

class Mom < ActiveRecord::Base
  has_many :follows, as: :followable
end

class Follow < ActiveRecord::Base
  belongs_to :follower, class_name: 'User'
  belongs_to :followable, polymorphic: true
end

我的路线:

  resources :dads do
    resources :follows
  end

  resources :moms do
    resources :follows
  end

现在在我的Follows控制器中我想加载所需的关联:

FollowsController

private
  def load_followable
    klass = [Dad, Mom].detect { |f| params["#{f.name.underscore}_id"]}
    @followable = klass.find(params["#{klass.name.underscore}_id"])
  end
end 

但这引发了这个错误:

undefined method `name' for nil:NilClass

由于@followable = klass.find(params["#{klass.name.underscore}_id"])

好的,所以似乎为了使klass不是nil我必须在控制器或视图中有东西?我想在我的索引页面上显示所有的妈妈和爸爸。这仍然会引发错误:

FollowsController
 before_action :load_followable

 index
  @follows = @followable.follows
 end

这是怎么做到的?

1 个答案:

答案 0 :(得分:1)

似乎 params 不包含 dad_id mom_id 。因此 detect 方法将 nil 返回到 klass 。也许您应该查看您的视图以确认任何表单确实提交了父亲或母亲的身份证明?


如果要显示所有记录,则不应使用load_followable,因为它需要首页将参数发布到控制器。您可能需要做的只是在ActiveRecord上调用all方法:

FollowsController
#before_action :load_followable

 index
  @follows = Follow.all
 end

@follows将是您所有关注的数组。对于每个跟随,follow.followable将返回与之关联的父亲或母亲。