Techioz Blog

ransack を 4.0.0 にアップグレードすると Paper_trail gem が動作を停止しました

概要

私の Rails 7.0.4 アプリでは次のものを使用しています。

データの変更履歴をフィルタリングして並べ替えるためのページがあります。

ActiveAdmin.register PaperTrail::Version do
  menu label: 'History'
  actions :index

  index title: 'History' do
    id_column
    column :item
    column :event
    column 'Author' do |version|
      User.where(id: version.whodunnit.to_i).first
    end
    column 'Changes', :object_changes
    column :created_at
  end

  filter :item_type
  filter :item_id, as: :numeric
  filter :created_at, input_html: {autocomplete: :off}
  filter :whodunnit, label: 'Author', as: :numeric
  filter :object_changes
end

activeadmin 3.0.0 と ransack 4.0.0 にアップグレードする前は、すべてが正常に動作していました。 アップグレード後、すべてのページで次のエラーが発生します。 「Ransack には … として明示的に許可リストに登録された属性が必要です。」 この問題は、エラーが表示される履歴ページを除くすべてのページで簡単に修正されました。

class PaperTrail::Version < ApplicationRecord

  # ...

  def self.ransackable_attributes(auth_object = nil)
    ["created_at", "event", "id", "item_id", "item_type", "object", "object_changes", "whodunnit"]
  end

  # ...

end

私の config/initializers/paper_trail.rb はそれほど変わっておらず、ransackable_attributes メソッドを正しく追加したと思います。

module PaperTrail
  class Version < ActiveRecord::Base

    def self.ransackable_attributes(auth_object = nil)
      %w[created_at event id item_id item_type object object_changes whodunnit]
    end

    def user
      User.where(id: self.whodunnit.to_i).first
    end
  end
end

PaperTrail::Model::ClassMethods.module_eval do
  alias_method :old_has_paper_trail, :has_paper_trail
  def has_paper_trail(options = {})
    options[:ignore] ||= []
    options[:ignore] += [:created_at, :updated_at, :current_sign_in_at, :last_sign_in_at, :current_sign_in_ip, :last_sign_in_ip, :sign_in_count]
    old_has_paper_trail(options)
  end
end

しかし、エラーは同じままです。それを修正するにはどうすればよいですか?

解決策

少しばかげていますが、サーバーを再起動すると問題は解決しました。

PaperTrail::Version を初期化子として使用していたので、サーバーを再起動しないと変更は有効になりませんでした。他のモデルへの変更は再起動しなくても有効になりました。