
Rectify Form 深度上下文用 with_context 让嵌套表单轻松共享用户信息【免费下载链接】rectifyBuild maintainable Rails apps项目地址: https://gitcode.com/gh_mirrors/re/rectifyRectify是一个让 Rails 应用更易于维护的轻量级 Ruby Gem其核心组件Form Object表单对象负责输入数据的校验与管理。本文聚焦 Rectify Form 的with_context方法只需一行代码就能把「当前登录用户」等上下文信息注入根表单并自动传递到所有嵌套表单与表单数组中让深层校验轻松拿到用户信息。 痛点嵌套表单里拿不到当前用户吗Rectify 的设计观点是把职责拆得清清楚楚控制器只处理 HTTP 相关的事模型只负责数据关系校验规则和业务逻辑交给Form Object但很多校验离不开「当前请求」的信息——比如「这篇博客必须是当前用户自己的」。此时根表单还不难拿到current_user可一旦表单出现嵌套结构子表单或表单数组问题就来了子表单与父表单之间没有引用链它无法向上向父表单索要数据。这正是with_context要解决的深度上下文问题。⚡ 一行注入with_context 快速上手在控制器里构造表单时链式调用即可form UserForm.from_params(params).with_context(user: current_user)之后在表单任意位置都能通过context读取class UserForm Rectify::Form attribute :first_name, String validate :check_ownership def check_ownership # 表单内部直接通过 context.user 访问当前用户 end end它的实现位于lib/rectify/form.rbwith_context第 117–131 行传入 Hash 时会转成OpenStruct存储非 Hash 对象则原样保存context第 6 行只读访问器任何层级的表单都能调用 小贴士with_context接受任意对象。传 Hash 时用context.user这类属性方式访问直接把current_user对象传进去也完全合法。 深层传播嵌套表单与表单数组自动继承with_context不只是给根表单自己用它会沿着两条线自动向下传播嵌套表单属性如SchoolForm内嵌TeacherForm表单数组属性如UserForm.contacts声明为Array[ContactForm]以项目自带的测试 fixture 为例# spec/fixtures/forms/school_form.rb class SchoolForm Rectify::Form attribute :head, TeacherForm # 嵌套表单 end # spec/fixtures/forms/user_form.rb节选 class UserForm Rectify::Form attribute :address, AddressForm # 嵌套表单 attribute :contacts, Array[ContactForm] # 表单数组 end调用之后每一层表单都能拿到同一份上下文form SchoolForm.new(head: TeacherForm.new(name: )) .with_context(account_id: 1) form.head.context.account_id # 1 form.contacts.first.context.account_id # 1表单数组同理相关验证用例在spec/lib/rectify/form_spec.rb的#with_context描述块第 533–557 行正好覆盖了根表单、嵌套表单、表单数组三种场景可以放心参考。️ 实战在表单内校验资源归属readme.md的 Deep Context 章节给出的经典场景——发帖时校验博客归属class PostForm Rectify::Form attribute :blog_id, Integer attribute :tags, Array[TagForm] validate :check_blog_ownership def check_blog_ownership return if context.user.blogs.exists?(id: blog_id) errors.add(:blog_id, 不属于当前用户) end end注意最里层的TagForm表单数组里的元素同样能用context.user做归属校验——这就是深度上下文的价值无需把依赖会话信息的校验逻辑上移到 Command表单内部即可完成全部数据检查。 别混淆附加参数 vs 上下文两者都能给表单塞数据但去向不同方式数据去向适用场景from_params(params, ip: 1.2.3.4)填充表单属性上下文要成为表单字段值with_context(user: current_user)存入context仅校验/加工逻辑需要读取不属于表单数据判断标准很简单它会出现在表单字段里吗会 → 用附加参数不会、只是校验要用 → 用with_context。✅ 上手清单只需在根表单调用一次with_context深层嵌套自动继承传 Hash 时按OpenStruct存储用context.key方式访问只传递校验真正需要的最小信息当前用户、租户 ID、IP 等想临时跳过子表单校验时可搭配valid?(exclude_nested: true)、valid?(exclude_arrays: true)选项结语with_context是 Rectify Form Object 中不起眼却威力十足的小工具一行注入、深度共享让嵌套表单与表单数组里的每一条校验都能从容看见当前用户。把它和 Command、Query Object 组合使用Rails 应用的业务逻辑从此各得其所代码也更易测试与扩展。【免费下载链接】rectifyBuild maintainable Rails apps项目地址: https://gitcode.com/gh_mirrors/re/rectify创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考