Search code examples
ruby-on-railsrubyacts-as-taggable-on

Some Instance Methods Are Undefined in acts_as_taggable


I am currently getting the following error on my post model which is under act_as_taggable_on for tags and channels.

undefined local variable or method `tag_list_on' for #
<ActiveRecord::Relation:0x007f9864675b48>

I seems that rails cannot detect the existence of tag_list_on or set_tag_list_on methods; however, it does detect the tagged_with method, whose source is located in the exact same module as the other files.

RubyMine can detect the existence of all of these methods fine btw.

Here is the section of code that I'm performing all of these operations on.

@posts = Post.tagged_with(params[:tags]).paginate(:page => params[:page]|| 1, :per_page => 20)
user_tags = @posts.tag_list_on(:tags)                                                         
custom_tags = user_tags - params[:tags]                                                       
@posts.set_tag_list_on(:customs, custom_tags)                                                 
@tags = @posts.tag_counts_on(:customs, :order => "count desc").limit(10)                      
@channels = @posts.tag_counts_on(:channels, :order => "count desc")                           

Solution

  • tagged_with is a class method of Post, added by the acts_as_taggable_on gem.

    @posts in your code is an instance of ActiveRecord::Relation, not the Post class itself or any instance of it.

    There is no tag_list_on instance method in ActiveRecord::Relation, hence the error.

    tagged_with says it returns

    ...a scope of objects that are tagged with the specified tags.

    tag_list_on and set_tag_list_on are instance methods of the Post class, added by the acts_as_taggable gem.

    You need to call tag_list_on and set_tag_list_on for each instance of @posts

    user_tags = []
    @posts.each do |post|
      user_tags = user_tags + post.tag_list_on(:tags) 
    end
    custom_tags = user_tags.uniq - params[:tags]
    
    # ...