如何简化Middleman(Ruby on Rails)+HAML中的重复代码?
在Middleman+HAML中根据pageversion动态调用data变量避免重复代码
我正在使用Middleman(基于Ruby)搭配HAML开发,目前每个页面开头都需要写重复的条件判断代码,来切换测试/生产环境的配置变量:
- if pageversion == "test" - domain = data.testvars.domain - action_url = data.testvars.openlocker_url - lockergroup = data.testvars.lockergroup - else - domain = data.prdvars.domain - action_url = data.prdvars.openlocker_url - lockergroup = data.prdvars.lockergroup
我想通过类似 domain = data.#{pageversion}vars.domain 的动态方式简化这段重复代码,但尝试后一直报错,求可行的实现方案。
解决方案
在Ruby中无法直接通过字符串插值的方式访问对象属性,你可以用以下两种方式实现动态取值:
方法1:使用send方法动态调用属性
- # 先根据pageversion动态获取对应的vars对象 - vars = data.send("#{pageversion}vars") - # 统一从vars中提取变量 - domain = vars.domain - action_url = vars.openlocker_url - lockergroup = vars.lockergroup
send方法可以接收字符串形式的方法名,这样就能根据pageversion的值自动切换testvars或prdvars,后续直接复用vars对象提取属性即可。
方法2:将data作为哈希访问
Middleman的data对象支持哈希式的键访问,你也可以用方括号语法实现:
- vars = data["#{pageversion}vars"] - domain = vars[:domain] - action_url = vars[:openlocker_url] - lockergroup = vars[:lockergroup]
这种方式和send效果一致,只是通过哈希键来获取对应的配置组。
可选:添加默认值容错
如果担心pageversion出现非预期值,可以加个默认处理,比如默认使用生产环境变量:
- vars = data.send("#{pageversion}vars") rescue data.prdvars
内容的提问来源于stack exchange,提问作者ZundraDolo
相关产品推荐
相关产品推荐

