在 rails_admin 中获取登录用户关联记录

fetching logged in user associated record in rails_admin

我已经安装了 rails_admin gem 没有任何错误它的显示模型也很糟糕,但是我有要求我需要显示 current_user 登录相关数据

e.g User has many Books so in rails admin i want only that user book but currently it's showing all users books which is default behaviour of rails_admin

我也尝试使用 cancancan gem 来实现同样的事情,但它不起作用我的 rails_admin 初始化配置如下

rails_admin.rb
RailsAdmin.config do |config|
  ### Popular gems integration
  ## == Devise ==
   config.authenticate_with do
    warden.authenticate! scope: :user
   end
   config.current_user_method(&:current_user)
   config.parent_controller = 'ApplicationController'
  ## == Cancan ==
  config.authorize_with :cancan,UserAbility
  ## == Pundit ==
  # config.authorize_with :pundit
  config.included_models = ["Book","User"]
  config.actions do
    dashboard                     # mandatory
    index                         # mandatory
    new
    export
    bulk_delete
    show
    edit
    delete
    show_in_app
  end
end

UserAbility Class 实现如下

  class UserAbility
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
       if user.present?
         can :access, :dashboard
         can :manage, :Book,id:user.id
       end
  end
end

我认为您误解了 Rails 管理员的范围。本质上,它是您数据库的快照,用于更多管理操作,例如查询数据库中的特定内容。

您唯一可以合理地做的就是查找 given 用户的所有 Book,默认值为 all 本书供 all 用户使用。显示中存在过滤器,以便能够根据用户的特定凭据(例如用户名、电子邮件或 ID)缩小范围。

对于概念性检查,Rails 管理中的用户未被视为或视为与您的应用程序中的用户相同。相反,请考虑使用 Rails 管理员来检查数据库中的数据,而不是显示特定的、经过身份验证的人的数据。

正如您所描述的,更合适的 Rails 方法是为该数据创建一个控制器和路由,然后简单地使用 current_user.books 获取所有书籍当前用户。

而不是 can :manage, :Book,id:user.id,尝试使用:

can :read, Book, user_id: user.id

所以这些能力看起来像:

can :access, :rails_admin
can :dashboard
can :read, Book, user_id: user.id