Undefined method `type' for Polymorphic Association.

My Polymorphic association with the models Follow, Dad and Mom gives me an error when writing a method to see if a user is already following one of them.

Here are all of my models and the method following which is the problem.

Models

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

Controller

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

View

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

Error

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?'
  .................

This works if I get rid of followable_type but that removes the reason for the method. Why is this happening?

有帮助吗?

解决方案

This line is the problem

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

Replace followable.type with followable.class.name

type used to be a synonym for class but this was deprecated. Even if it hadn't been deprecated, you need to find records where followable_type is the name of the class, not the class itself.

其他提示

@MaxWilliams is correct although if you still want to use type you just need to include the method in your model

module Typeify
  def type
    self.class.name
  end
end
class Mom
  include Typeify
end 
class Dad
  include Typeify
end
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top