Search code examples
ruby-on-railsrubyargumentsruby-on-rails-5

Rails : Wrong number of arguments (given 1, expected 0)


I get this error on my posts index page :

enter image description here

This the model :

class Post < ApplicationRecord

  include Filterable

  belongs_to :region
  belongs_to :category
  belongs_to :topic
  validates :title, presence: true, length: { maximum: 500 }
  validates :content, presence: true
  validates :published_at, presence: true
  translates :title, :content, :slug, touch: true, fallbacks_for_empty_translations: true
  has_attached_file :image, styles: { thumb: "100x70#", featured: "1560x868#", small: "760x868#", big: ">1600x1600" }
  validates_attachment :image, content_type: { content_type: ["image/jpeg", "image/gif", "image/png"] }
  validates_attachment_presence :image

  scope :published, -> (published) { where(published: (['true', true].include? published)).order(featured: :desc, published_at: :desc) }
  scope :published_until_now, -> { where("published_at < ?", Time.now).merge(Post.published(true)) }
  scope :topic, -> (topic_id) {
    joins(:topic).where('topic_id = ?', topic_id) }
  scope :category, -> (post_category) {
    joins(:category).where('category_id = ?', post_category) }
  scope :match, -> (search_term) {
    with_translations(I18n.locale).where('content like ? or title like ?', "%#{search_term}%", "%#{search_term}%") }

  self.per_page = 10

  after_save :unfeature_older_posts, if: Proc.new { |post| post.featured? }

  extend FriendlyId
  friendly_id :title, use: :globalize

  def unfeature_older_posts
    featured_posts = Post.where(featured: true).where.not(id: id).order(published_at: :desc)
    if featured_posts.size == 1
      featured_posts.last.update(featured: false)
    end
  end

end

This the controller :

class PostsController < ApplicationController

  before_action :get_pages_tree, :get_privacy_policy, only: [:index, :show]

  def index
    @filters = params.slice(:topic, :category)
    @posts = Post.published_until_now
      .filter(@filters)
      .paginate(:page => params[:page], per_page: 11)
  end

  def show
    @post = Post.friendly.find(params[:id])
  end
end

and filter is defined here :

module Filterable
  extend ActiveSupport::Concern

  module ClassMethods
    def filter(filtering_params)
      results = self.where(nil)
      filtering_params.each do |key, value|
        results = results.public_send(key, value) if value.present?
      end
      results
    end
  end
end

I'm not sure where to go from here. I recently upgraded to Ruby on Rails 5 and Ruby 2.7.0, I don't know if it's related.


Solution

  • Try replacing module ClassMethods with class_methods do.

    If it works, then please keep in mind:


    filter method comes from Ruby. It's defined in Array. As you can see in the doc, filter method on Array takes no argument. That's the direct cause of the error you see.

    In Rails, when methods on Array are called on ActiveRecord object (in your case, Post.published_until_now) and when methods cannot be found on a model, it automatically converts itself into an Array. So, it calls filter method on Array. Generally, you don't want to define methods such as filter which is confusing.