未定义的方法`type' for Polymorphic Association

时间:2014-05-15 12:52:24

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

Polymorphic Association的未定义方法`type'。

My Polymorphic与模型关联,爸爸和妈妈在编写方法时会给我一个错误,看看用户是否已经关注其中一个。

以下是我的所有模型和方法following,这就是问题所在。

模型

class User
 has_many :follows

  def following?(followable)
    follows.where(followable_id: followable.id, followable_type: followable.type ).any?
  end
end

class Mom
  has_many :follows, as: :followable, dependent: :destroy
end

class Dad
  has_many :follows, as: :followable, dependent: :destroy
end

控制器

@dad = Dad.find(params[:dad_id])

查看

<% unless current_user.following?(@dad) %>
  <%= link_to({ controller: 'follows', action: 'create', id: @dad.id }, { method: :post }) do %>
    Follow
  <% end %>
<% end %>

错误

NoMethodError - undefined method `type' for #<Dad:0xaf63038>:
  activemodel (4.0.2) lib/active_model/attribute_methods.rb:439:in `method_missing'
  activerecord (4.0.2) lib/active_record/attribute_methods.rb:155:in `method_missing'
  app/models/user.rb:17:in `following?'
  .................

如果我摆脱followable_type但这消除了该方法的原因,这是有效的。为什么会这样?

2 个答案:

答案 0 :(得分:4)

这一行是问题

follows.where(followable_id: followable.id, followable_type: followable.type ).any?

followable.type替换为followable.class.name

type曾经是class的同义词,但已被弃用。即使它没有被弃用,你需要找到followable_type是类的名称而不是类本身的记录。

答案 1 :(得分:1)

@MaxWilliams是正确的,但如果你仍想使用type,你只需要在模型中包含该方法

module Typeify
  def type
    self.class.name
  end
end
class Mom
  include Typeify
end 
class Dad
  include Typeify
end