我使用的是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
这是怎么做到的?
答案 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
将返回与之关联的父亲或母亲。