尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
RailsAdmin Show In App 动作详解:从后台跳转前台页面与权限配置
后端【免费下载链接】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),仅供参考
RELATED

相关推荐

Vue DevTools 浏览器扩展:Chrome 与 Chromium 系浏览器(Edge/Arc/Brave)的安装与工作原理

Vue DevTools 浏览器扩展:Chrome 与 Chromium 系浏览器(Edge/Arc/Brave)的安装与工作原理

【免费下载链接】devtools-next ⚙️ Devtools for debugging Vue.js applications. 项目地址: https://gitcode.com/gh_mirrors/de/devtools-next 点击查看 免费下载 Vue DevTools 的浏览器扩展是调试 Vue.js 应用最直接的接入方式:安装后在 DevTools …

📅 2026/10/6 1:59:43
90DaysOfDevOps 第 71 天:什么是 Jenkins?——从 CI 工具定位到 Kubernetes 集群部署实战

90DaysOfDevOps 第 71 天:什么是 Jenkins?——从 CI 工具定位到 Kubernetes 集群部署实战

文档/教程 【免费下载链接】90DaysOfDevOps This repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Pri…

📅 2026/10/6 1:59:43
LSP workspace/didRenameFiles 文件重命名通知详解:能力协商、RenameFilesParams 与注册模式实战

LSP workspace/didRenameFiles 文件重命名通知详解:能力协商、RenameFilesParams 与注册模式实战

开发工具 【免费下载链接】language-server-protocol Defines a common protocol for language servers. 项目地址: https://gitcode.com/gh_mirrors/la/language-server-protocol 点击查看 免费下载 workspace/didRenameFiles 是 Language Server Protocol&#x…

📅 2026/10/6 1:59:43
MORE NEWS

更多资讯

📰

微信小程序护肤购物系统实践:数据建模与2MB主包优化

1. 项目概述与设计思路1.1 这个选题解决了什么问题先聊点实在的。做毕业设计或者个人项目选型,最难的不是实现本身,而是“这个题目最后能不能作为一个完整的故事讲出来”。护肤购物系统这个题目,名字里三个关键词缺一不可:微信小程…

📰

嵌入式Linux入门:从裸机到命令行,开发者必须掌握的实用命令与调试技巧

从单片机裸机开发转向嵌入式Linux,第一道坎往往不是C语言,也不是中断、寄存器这些老熟人,而是那个黑乎乎的终端界面。串口工具连上开发板,光标停在#符号前面,你突然发现自己连“看看目录里有什么”都做不到&#xff0c…

📰

莫以skill小而不为:AI Agent技能虽小却有大能量

大概两年前,我第一次在AI工具里看到"skill"这个词的时候,心里想的是:这不就是一段提示词打包成文件吗,能有什么技术含量。直到后来一个几十KB的小skill,让我在项目里少写了两百行逻辑,我才意识到…

📰

多智能体协作触达监控框架Agent-Reach:设计、指标与踩坑实践

最近我把自己搭的一个多智能体协作框架翻出来做了一次大的重构,顺手把所有"触达"相关的问题收敛成了一个独立模块,项目代号暂时就叫Agent-Reach。可能有人一听这个名字会以为是个网络探测或者渠道触达的工具,但其实不是&#xff0c…

📰

AI编程超级能力:本地化开发工具链的范式迁移

1. “Superpowers”不是功能,是开发者工具链的范式迁移最近在几个技术社区和内部分享里,反复听到一个词——“superpowers”。它既不是某个新发布的开源库,也不是某家大厂刚推出的SaaS服务,更不是什么玄学概念。它本质上是一类以A…

📰

基于Hadoop的智能图书推荐系统:从用户行为日志到协同过滤的完整实践

简介:基于Hadoop框架与用户行为特征感知的智能图书推荐系统设计的学士学位毕业论文,原为西南财经大学毕业论文,主要面向计算机科学与技术、软件工程等专业的本科、专科毕业生,也适合对大数据处理与个性化推荐感兴趣的学习者。论文…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬