Ransack 需要 <Model> 关联明确列入可搜索名单

问题描述 投票:0回答:2

背景

我的代码一直在运行并工作,直到我安装了 gem 'ipaddress',但现在我之前创建的模型都出现以下错误

Ransack 需要 明确列入许可名单的协会 可搜索。

在您的

ransackable_associations
中定义一个
User
类方法 模型,留意您不想搜索的项目(例如 例如,
encrypted_password
password_reset_token
owner
或 其他敏感信息)。您可以使用以下内容作为基础:

class User < ApplicationRecord

  # ...

  def self.ransackable_associations(auth_object = nil)
    ["comments", "created_by", "favorites", "impressions_by_user", "updated_by", "user_group"]
  end

  # ...

The issue I have with this is I need a dynamic to do this instead of having to redo this for every single model that I have created.
ruby-on-rails ruby rubygems ransack
2个回答
5
投票

解决方案

我必须将模型从使用 ActiveRecord::Base 更改为使用 ApplicationRecord,然后创建一个包含以下代码的 Application_Record.rb 文件:

class ApplicationRecord < ActiveRecord::Base
  primary_abstract_class

  Rails.logger.info("INSIDE APPLICATION RECORD");
  self.abstract_class = true

  def self.ransackable_attributes(auth_object = nil)
    column_names + _ransackers.keys
  end

  def self.ransackable_associations(auth_object = nil)
    reflect_on_all_associations.map { |a| a.name.to_s } + _ransackers.keys
  end
end

然后必须在初始化程序中调整印象派扩展以添加以下方法

def ransackable_associations(auth_object = nil)
  Rails.logger.info("WITHIN RANSACK ASSOCIATION")
  super + %w[impressionable]
end

0
投票

从 ransack 4 开始,ransack 需要显式地将关联和属性列入白名单。此合并请求引入了更改。

如果您知道自己在做什么,可以通过将其恢复为 4.0 之前的代码来禁用该行为。

# app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  # ...

  def self.ransackable_associations(auth_object = nil)
    @ransackable_associations ||= reflect_on_all_associations.map { |a| a.name.to_s }
  end

  def self.ransackable_attributes(auth_object = nil)
    @ransackable_attributes ||= column_names + _ransackers.keys + _ransack_aliases.keys + attribute_aliases.keys
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.