SuperAPI AI 工具集

inertia-rails-controllers

编程与开发

查看项目

更新于 10-15 11:46

技能介绍

用途

Inertia Rails Controllers 提供 Rails 控制器在服务 Inertia 响应时的服务端模式,帮助开发者正确地把数据从后端传递到 Inertia 前端页面。

主要能力

渲染语法

必须使用 render inertia: { key: data } 传递 props。实例变量不会自动作为 props 传递,除非项目配置了 alba-inertia gem(需检查 Gemfile)。default_render: true 只会自动推断组件名,不会自动传递实例变量。

  • 动作加载数据:render inertia: { users: data },组件路径由控制器/动作推断
  • 动作不加载数据(静态页面):空动作或 render inertia: {}
  • 渲染不同页面:render inertia: 'errors/show', props: { error: e },使用显式路径

经验法则:如果动作访问数据库,就必须调用 render inertia: 并传入数据;空动作只会收到共享 props。

Prop 类型

所有 prop 辅助方法都是 InertiaRails 常量上的模块方法,正确写法是 InertiaRails.defer { ... },而不是 inertia.defer 或 Inertia.defer。

  • 普通:{ key: value },始终求值并包含
  • Lazy:-> { expensive_value },初始渲染时包含,部分重载时惰性求值
  • Optional:InertiaRails.optional { ... },仅在请求它的部分重载时求值
  • Defer:InertiaRails.defer { ... },初始页面渲染后加载
  • Defer(分组):InertiaRails.defer(group: 'name') { ... },分组延迟,并行获取
  • Once:InertiaRails.once { ... },解析一次,跨导航记忆
  • Merge:InertiaRails.merge { ... },追加到现有数组(无限滚动)
  • Deep merge:InertiaRails.deep_merge { ... },深度合并到现有对象
  • Always:InertiaRails.always { ... },即使部分重载也包含
  • Scroll:InertiaRails.scroll { ... },用于无限滚动的滚动感知 prop

共享数据

使用控制器中的 inertia_share,它需要控制器上下文(current_user、request)。初始化器只处理 config.* 设置(version、flash_keys)。支持静态值、lambda 和条件共享。多个 inertia_share 调用自上而下合并,子控制器同名键会覆盖父控制器。

Flash 消息

Flash 是自动的。如需自定义暴露的键,在 config/initializers/inertia_rails.rb 中配置 config.flash_keys,默认是 %i[notice alert]。控制器中使用标准 Rails flash。

重定向与验证错误

create/update/delete 后始终重定向(Post-Redirect-Get)。验证错误处理使用 redirect_back_or_to new_user_path, inertia: { errors: @user.errors.to_hash(true) }。to_hash(true) 会生成带字段名的完整消息,键必须与输入框 name 属性匹配。禁止使用 errors.full_messages,因为它生成扁平字符串,无法映射到前端输入字段。

授权作为 Props

将权限作为按资源的 can hash 传递,前端控制可见性,服务端强制访问。实现授权 props 时需阅读 references/authorization.md。

外部重定向(inertia_location)

对 Inertia 应用之外的 URL(支付提供商、OAuth、外部服务)必须使用 inertia_location,而不是 redirect_to。redirect_to 返回 302,但 Inertia 客户端会尝试将其作为 JSON 解析,导致重定向损坏。inertia_location 返回 409 加 X-Inertia-Location 头,告诉客户端执行 window.location = url。

历史加密

加密浏览器历史状态中的页面数据,配置 config.encrypt_history = Rails.env.production?。在登出或角色变更时使用 redirect_to path, inertia: { clear_history: true }。

配置

所有 InertiaRails.configure 选项(version、encrypt_history、flash_keys 等)见 references/configuration.md。

使用方式

该技能以规则和代码示例的形式提供,开发者可按照其中的模式编写 Rails 控制器。涉及高级 prop 类型(merge、scroll、deep_merge)或组合多个 prop 选项时,需阅读 references/prop-types.md;首次设置 InertiaRails.configure 或调试配置问题时,需阅读 references/configuration.md。

适用场景

适用于使用 Inertia.js 构建 Rails 全栈应用的开发者,尤其是需要处理页面数据传递、延迟加载、共享数据、Flash 消息、验证错误、外部重定向和授权 props 的场景。

限制

  • 实例变量不会自动传递,除非配置 alba-inertia gem
  • 外部 URL 不能使用 redirect_to
  • 验证错误不能使用 errors.full_messages
  • prop 辅助方法必须使用 InertiaRails 常量
  • 自定义 flash 键需同时更新初始化器配置和 FlashData TypeScript 类型
  • 具体版本、收费、价格、平台、效果等信息暂未提供