gon怎么用:我在 Rails 里的做法

gon怎么用,最稳的方式不是把所有变量一股脑丢进去,而是把它当页面启动参数。我在 Rails 项目里通常只用它传首屏必需数据,配合清晰命名和最小字段,前端读起来很省心。

总览:gon 解决一个小而硬的问题

你可以把 gon 理解成 Rails 后端递给前端的一张小纸条。页面渲染时,controller 已经知道当前用户、订单状态、图表数据,前端初始化又刚好需要这些值。gon 就负责把这张纸条安全地放到浏览器里。

我用 gon 的原则很简单:只传首屏马上要用的数据,不传会频繁变化的数据,不传敏感字段。照这个规则走,它会很顺手;越界使用,后面一定难查。

安装和页面引入

Rails 项目里一般是在 Gemfile 加 gem 'gon',bundle install 后,在布局文件里按官方文档要求输出 gon 变量。不同 Rails 版本和前端打包方式会有差异,所以我会先按项目现有 layout 找位置,不会随便塞到某个局部模板里。

关键点是:gon 的输出要早于使用它的前端脚本。否则 JS 执行时 window.gon 还不存在,浏览器控制台就会报 undefined。这个坑很常见,尤其是你把脚本移到 defer 或打包入口以后。

想要完整资源?

会员专享,海量内容

立即查看 →

在 controller 里放数据

最常见写法是在 action 里设置:gon.order_status = @order.status,gon.chart_data = {...}。我更喜欢把数据整理成小 hash,而不是把 @order 整个丢过去。前端需要什么就给什么,别图省事。

比如订单详情页,前端只需要 id、status、paid_amount,就组一个 gon.order = { id: @order.id, status: @order.status, paid_amount: @order.paid_amount.to_s }。金额这类字段我经常显式转字符串,避免 JS 浮点数精度带来误会。

在 JavaScript 里读取

前端读取时别到处散落 gon.xxx。我一般会在入口文件开头集中读一次:const order = window.gon?.order。然后把 order 传给初始化函数。这样后面要改数据来源,从 gon 换成接口,也不会全项目搜一堆 window.gon。

还要给默认值。后台系统经常有权限差异,有些用户看不到某块图表,对应 gon 字段可能不存在。前端写成 const chartData = window.gon?.chart_data || [],体验会稳很多。

收尾:用得克制才好维护

gon怎么用,说到底就是四个动作:安装、布局输出、后端赋值、前端读取。真正决定质量的不是这四步,而是你有没有限制它的使用范围。

我建议每个页面只保留一两个结构化变量,命名跟页面功能绑定,比如 gon.invoice_page、gon.report_filters。看到名字就知道用途,后面接手的人才不会把它当成神秘全局变量。

常见问题

gon怎么用在 Rails controller 里?
在 action 中给 gon 赋值即可,例如 gon.user_id = current_user.id。页面正确输出 gon 脚本后,前端能通过 window.gon.user_id 读取。
gon 变量前端读不到怎么办?
先检查 layout 是否输出了 gon,再看输出位置是否早于前端脚本执行,最后确认当前 action 是否真的设置了对应变量。
gon 可以传数组和对象吗?
可以,常见做法是传 hash 或 array。但建议只传前端需要的字段,避免把完整数据库对象暴露出去。

获取完整内容

加入会员,海量资源任你看

立即进入 →