You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails Admin自定义InAppShow新动作不显示问题求助

解决Rails Admin自定义应用内展示动作(替代移除的show_in_app)

确实,新版Rails Admin已经移除了默认的show_in_app动作,旧教程里的代码在新版本中需要调整细节才能正常显示。下面是经过验证的完整实现方案:

1. 创建并修正自定义动作文件

在lib/in_app_show.rb中更新代码,适配新版Rails Admin的规范:

require 'rails_admin/config/actions'
require 'rails_admin/config/actions/base'

module RailsAdmin
  module Config
    module Actions
      class InAppShow < RailsAdmin::Config::Actions::Base
        # 注册动作到Rails Admin
        RailsAdmin::Config::Actions.register(self)

        # 标记为单条记录专属动作(member action)
        register_instance_option :member do
          true
        end

        # 明确动作名称(用于配置中调用)
        register_instance_option :action_name do
          :in_app_show
        end

        # 控制动作是否可见:确保用户有权限,且对象能生成合法的前端URL
        register_instance_option :visible? do
          authorized? && begin
            # 检查模型是否有对应的路由助手方法
            bindings[:object].respond_to?(:to_param) && 
            bindings[:controller].main_app.respond_to?("#{bindings[:object].class.name.underscore}_path".to_sym)
          rescue
            false
          end
        end

        # 动作核心逻辑:重定向到应用内的对象展示页
        register_instance_option :controller do
          proc do
            redirect_to main_app.polymorphic_path(@object), notice: "跳转到应用内展示页面"
          end
        end

        # 设置动作图标(新版Rails Admin默认用Font Awesome,替换为适配的图标类)
        register_instance_option :link_icon do
          'fa fa-external-link'
        end

        # 禁用PJAX,避免跳转异常
        register_instance_option :pjax? do
          false
        end

        # 设置动作显示的标签文本
        register_instance_option :label do
          '应用内展示'
        end
      end
    end
  end
end

关键调整说明:

  • 图标替换:旧的icon-camera-retro属于Bootstrap Glyphicons,新版Rails Admin默认使用Font Awesome,因此换成fa fa-external-link这类兼容的图标类。
  • visible?逻辑优化:更可靠地检查对象是否有对应的路由助手方法,避免无差别rescue吞掉有效错误。
  • 新增action_name和label:明确动作标识和显示文本,减少配置时的歧义。

2. 配置Rails Admin加载并启用动作

在config/initializers/rails_admin.rb中更新配置:

# 先加载自定义动作文件
require Rails.root.join('lib', 'in_app_show.rb')

RailsAdmin.config do |config|
  # 你的其他Rails Admin配置(比如权限、当前用户方法等)
  # config.authenticate_with { ... }
  # config.current_user_method { ... }

  # 启用动作列表
  config.actions do
    dashboard # 必选动作
    index # 必选动作
    new
    export
    bulk_delete
    show
    edit
    delete
    # 添加自定义的应用内展示动作
    in_app_show
  end
end

额外注意:

如果你的Rails版本较新,需要确保lib目录在加载路径中,可在config/application.rb中添加:

config.autoload_paths << Rails.root.join('lib')

修改完成后重启Rails服务器,因为初始化文件和lib目录下的文件需要重新加载。

3. 测试验证

启动服务器后,进入Rails Admin的任意记录详情页,你应该能看到新增的「应用内展示」按钮(带外部链接图标),点击后会跳转到应用中该记录的前端展示页面。

如果仍不显示,可排查以下点:

  • 对应模型是否生成了xxx_path路由助手(比如post_path对应Post模型)。
  • 暂时移除visible?中的authorized?,测试是否是权限问题。
  • 查看服务器日志,检查是否有加载in_app_show.rb的错误信息。

内容的提问来源于stack exchange,提问作者Afsanefda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:31:54