Rails:参数数量错误(给定 1,预期 0)
Rails : Wrong number of arguments (given 1, expected 0)
我在 posts
索引页上收到此错误:
此型号:
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
这个控制器:
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
和filter
定义在这里:
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
我不确定从这里到哪里去。我最近在Rails5和Ruby2.7.0升级到Ruby,不知道有没有关系。
尝试将 module ClassMethods
替换为 class_methods do
。
如果有效,请记住:
filter
方法来自 Ruby。它在 Array
中定义。正如您在 doc 中看到的那样,Array
上的 filter
方法没有参数。这是您看到的错误的直接原因。
在 Rails 中,当在 ActiveRecord
对象(在您的情况下为 Post.published_until_now
)上调用 Array
上的方法并且在模型上找不到方法时,它会自动将自己转换为 Array
。因此,它在 Array
上调用 filter
方法。通常,您不想定义诸如 filter
这样令人困惑的方法。
我在 posts
索引页上收到此错误:
此型号:
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
这个控制器:
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
和filter
定义在这里:
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
我不确定从这里到哪里去。我最近在Rails5和Ruby2.7.0升级到Ruby,不知道有没有关系。
尝试将 module ClassMethods
替换为 class_methods do
。
如果有效,请记住:
filter
方法来自 Ruby。它在 Array
中定义。正如您在 doc 中看到的那样,Array
上的 filter
方法没有参数。这是您看到的错误的直接原因。
在 Rails 中,当在 ActiveRecord
对象(在您的情况下为 Post.published_until_now
)上调用 Array
上的方法并且在模型上找不到方法时,它会自动将自己转换为 Array
。因此,它在 Array
上调用 filter
方法。通常,您不想定义诸如 filter
这样令人困惑的方法。