用途
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 类型
- 具体版本、收费、价格、平台、效果等信息暂未提供