后端【免费下载链接】rails_adminRailsAdmin is a Rails engine that provides an easy-to-use interface for managing your data项目地址https://gitcode.com/gh_mirrors/ra/rails_admin点击查看免费下载本篇文章以 RailsAdmin 内置的show_in_app动作为核心讲解它如何让管理员在后台管理界面中一键跳转到业务系统前台应用中对应对象的展示页面并完整覆盖其实现原理、默认配置、CanCanCan / Pundit 授权方式、可见性控制以及集成测试验证。读完本文你将掌握该动作的完整工作机制并能在自己的 Rails 项目中精确配置它的显示范围与访问权限。Show In App 是什么show_in_appShow in app是 RailsAdmin 的成员级member动作之一作用于单个数据对象。它的职责非常单一把当前后台正在查看的记录在主应用即宿主 Rails 应用的前台中找到对应页面并跳转过去。典型场景是管理员在/admin/player/1/show中查看一名球员的详情点击 Show in app 后直接进入前台/players/1的公开页面。该动作的完整实现位于 lib/rails_admin/config/actions/show_in_app.rb全类只有 35 行是整个 RailsAdmin 动作体系中小而美的典型代表。动作的默认注册与路由show_in_app在 RailsAdmin 中是默认开启的动作之一。docs/actions.md 中明确列出默认配置等价于# config/initializers/rails_admin.rb RailsAdmin.config do |config| config.actions do # root actions dashboard # mandatory # collection actions index # mandatory new export history_index bulk_delete # member actions show edit delete history_show show_in_app end end由于它是成员级动作其路由会被挂载到对象粒度上。查看 config/routes.rb 中动作路由的动态生成逻辑RailsAdmin::Config::Actions.all(:member).each { |action| match /#{action.route_fragment}, action: action.action_name, as: action.action_name, via: action.http_methods }也就是说show_in_app生成的访问路径形如/admin/:model_name/:id/show_in_app其route_fragment、action_name、authorization_key、i18n_key等默认都取自动作键名:show_in_app参见 lib/rails_admin/config/actions/base.rb 中register_instance_option :key/self.key的实现name.to_s.demodulize.underscore.to_sym。源码级解析这个动作到底做了什么打开 lib/rails_admin/config/actions/show_in_app.rb可以看到四个关键实例选项它们共同决定了该动作的行为register_instance_option :member do true end register_instance_option :visible? do authorized? begin bindings[:controller].main_app.url_for(bindings[:object]) rescue StandardError false end end register_instance_option :controller do proc do redirect_to main_app.url_for(object) end end register_instance_option :link_icon do fas fa-eye end register_instance_option :turbo? do false end逐项解读:member为true声明该动作作用于单个对象。在 base.rb 中member?决定了breadcrumb_parent默认指向[:show, bindings[:abstract_model], bindings[:object]]即面包屑会挂在 Show 动作之下。:visible?双重要求首先必须通过authorized?见下文授权小节其次尝试调用main_app.url_for(bindings[:object])为主应用中的该对象生成 URL。这里用rescue StandardError兜底一旦主应用路由无法为该对象生成 URL例如缺少 show 路由、对象没有to_param对应的页面等动作就自动不可见。这保证了Show in app按钮永远不会出现在一个跳转不了的对象上。:controller重定向动作真正被访问时直接redirect_to main_app.url_for(object)把请求重定向到主应用的对象页面。注意它没有渲染任何 RailsAdmin 视图而是完全交还给宿主应用的路由系统。:link_icon使用 Font Awesome 的fas fa-eye眼睛图标作为按钮图标。:turbo?为false与大多数动作不同该动作不通过 Turbo Drive 导航因为它是跳转到主应用页面的外部跳转需要完整页面加载。测试 spec/integration/actions/show_in_app_spec.rb 专门验证了这一点it has the>actions: show_in_app: menu: Show in app授权控制原文档核心示例show_in_app与 CanCanCan及其前身 CanCan的协作是该动作文档的核心内容。docs/show-in-app-action.md 给出了授权声明示例can :manage, :all # includes can :show_in_app, :all # includes can :show_in_app, Model # includes can :show_in_app, Model, { conditions }解读这四行的含义can :manage, :all允许管理所有资源其中隐含了show_in_app授权can :show_in_app, :all对所有模型开放该动作的访问can :show_in_app, Model仅对指定模型开放can :show_in_app, Model, { conditions }在指定模型基础上叠加条件哈希实现满足条件的记录才能跳转前台的精细控制。授权键的由来在 base.rb 中authorization_key的默认实现是key.to_sym而key由类名推导因此ShowInApp类的授权键就是:show_in_app。每个动作在显示链接、访问页面之前都会经过authorized?检查见 base.rb 的register_instance_option :authorized?authorized? do enabled? ( bindings[:controller].try(:authorization_adapter).nil? || bindings[:controller].authorization_adapter.authorized?(authorization_key, bindings[:abstract_model], bindings[:object]) ) end只要配置了授权适配器show_in_app的显示与访问都会以can :show_in_app, Model, object的形式查询授权其中object是当前被检查的对象实例见 docs/cancancan.md 中成员级动作的授权清单can :show_in_app, Model, object。在 Ability 中完整配置结合 docs/cancancan.md 的说明一个可运行的完整示例为# config/initializers/rails_admin.rb RailsAdmin.config do |config| config.authorize_with :cancancan endclass Ability include CanCan::Ability def initialize(user) can :access, :rails_admin # grant access to rails_admin can :read, :dashboard # grant access to the dashboard return unless user # 所有登录用户都能跳转前台但只对未退役的球员生效 can :show_in_app, Player, retired: false end endcancancan_spec.rb 中的测试 Ability 正是这样写的can :show_in_app, Player, retired: false if user.roles.include? :show_in_app_player测试断言了三种典型行为未授予show_in_app权限的角色列表与 Show 页均不出现.show_in_app_member_link且无 Show in app 文案仅授予read_playershow_in_app_player列表与 Show 页出现该链接同时 Edit / Delete / History 链接不出现——证明授权是按动作独立控制的授予adminmanage_player所有成员级动作链接全部出现。使用 Pundit若改用 Pundit则授权键同样生效。在 spec/policies.rb 中可以看到ApplicationPolicy定义了show_in_app?方法通过user.roles.include? :admin控制def show_in_app? user.roles.include? :admin endPundit 适配器会把:show_in_app授权键映射为策略中的show_in_app?方法详见 lib/rails_admin/extensions/pundit/authorization_adapter.rb 与 docs/authorization.md。精细化控制可见性与作用范围通过 visible 块控制除了授权还可以直接覆写visible?选项做更精细的控制。这正是原文档 docs/show-in-app-action.md 末尾链接所指的方向docs/actions.md 中明确建议参考 Show in App 的实现来理解 visible 块的用法。可用的绑定有bindings[:controller]当前控制器实例bindings[:abstract_model]被检查的抽象模型成员级动作可用bindings[:object]被检查的对象实例仅成员级动作可用示例只允许对未归档的对象显示跳转按钮RailsAdmin.config do |config| config.actions do show_in_app do visible do object bindings[:object] object.present? !object.archived? end end end end注意 docs/actions.md 的提醒在 RailsAdmin 创建路由或定义 controller 动作的生命周期早期bindings可能为nil所以visible块内对绑定值的判空是安全写法。按模型限定作用范围沿用在 docs/actions.md 中描述的基础选项可以为该动作限定模型范围RailsAdmin.config do |config| config.actions do show_in_app do only [Player] # 只在 Player 模型上出现 # except [Team] # 或使用 except 排除 end end endonly/except由 base.rb 中的enabled?实现强制执行结合bindings[:abstract_model].config.excluded?一并判定。一个关键设计无法生成 URL 时自动隐藏show_in_app的visible?实现中rescue StandardError的设计值得特别强调。它意味着如果主应用无法为当前对象生成 URL比如模型没有对应前台 show 路由、to_param解析失败该动作会静默地从操作菜单中消失而不是渲染出一个注定 404 的死链。这为使用该动作的项目提供了天然的保护——你无需为每个模型手工判断前台是否有页面RailsAdmin 会自动替你探测。从实现上看main_app.url_for(bindings[:object])会触发主应用的路由系统对对象执行polymorphic_path之类的解析一旦主应用routes.rb中缺少对应资源的 show 路由url_for抛出异常即被吞掉并返回false。自定义与二次开发如果你需要对跳转行为做定制例如跳转前带参数、跳转到自定义路径可以直接在 initializer 中覆写该动作的controller选项RailsAdmin.config do |config| config.actions do show_in_app do controller do redirect_to main_app.polymorphic_path(object, utm_source: admin) end end end end更彻底的方案是参考 docs/actions.md 中Create a reusable action一节继承RailsAdmin::Config::Actions::Base并register一个新动作类lib/rails_admin/config/actions.rb 中的register方法把跳转逻辑封装成可复用的自定义动作。小结show_in_app虽小却集中体现了 RailsAdmin 动作系统的几大设计理念动作即配置对象register_instance_option、授权自动联动authorized?与authorization_key、可见性按对象动态判定visible?url_for探测、以及与 Turbo 的集成取舍turbo? false。阅读它的源码lib/rails_admin/config/actions/show_in_app.rb与对应集成测试spec/integration/actions/show_in_app_spec.rb、spec/integration/authorization/cancancan_spec.rb是理解并二次开发 RailsAdmin 自定义动作的最佳切入点。赞分享后端【免费下载链接】rails_adminRailsAdmin is a Rails engine that provides an easy-to-use interface for managing your data项目地址https://gitcode.com/gh_mirrors/ra/rails_admin点击查看免费下载相关推荐RailsAdmin Show 动作详解详情页视图、CanCanCan 授权与自定义实战RailsAdmin Show 动作详解详情页视图、CanCanCan 授权与自定义实战 RailsAdmin 的 Show 动作是每个模型详情页背后的核心引后端RuoYi-Vue-fast前端路由配置教程页面跳转与权限控制RuoYi Vue fast前端路由配置教程页面跳转与权限控制 在现代Web应用开发中前端路由Router扮演着至关重要的角色它不仅负责页面之间的跳转Android 14后台活动权限XXPermissions适配详解Android 14后台活动权限XXPermissions适配详解 你是否遇到过应用在后台运行时突然停止定位更新的问题是否在Android 14升级后发现应移动开发认证鉴权上一篇PyTorch证书备考终极指南The Incredible PyTorch认证资源包 下一篇JavaScript 对象与 JSON 互转实战JSON.stringify / JSON.parse 深度解析与深度克隆Modern JavaScript Tutorial 精读创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?