Ruby on Rails 共享组件positionRight参数绑定动态CSS类失效问题
原因说明
- 运算符优先级错误:
defined?的优先级低于逻辑与&&,你写的defined? positionRight && positionRight实际会被解析为defined?(positionRight && positionRight),和你预期的「先判断变量是否存在、再判断值是否为真」的逻辑完全不符,这是你传了positionRight: true仍然拿到空类的直接原因。 - 用法错误:Rails Partial 中不能用
defined?判断传入的本地变量是否存在。Rails 模板渲染机制会预先声明所有你在模板中引用过的变量名,只要你写了这个变量名,defined?就会返回存在状态,不会得到你预期的假值;如果外部没有传这个参数,直接访问变量还会抛出未定义异常。
解决方法
推荐使用Rails Partial 内置的local_assigns哈希处理可选参数,这是官方推荐的标准写法,有两种常用实现:
方案1:直接在属性绑定处判断
<section class="<%= local_assigns.fetch(:positionRight, false) ? 'custom-css-class' : '' %>">
fetch方法的第二个参数是参数未传递时的默认值,写法简洁无需额外声明。
方案2:开头统一声明可选参数默认值
如果可选参数多,推荐在Partial开头统一声明,后续代码直接使用变量即可:
<%# 开头统一设置所有可选参数默认值 %> <% positionRight = local_assigns.fetch(:positionRight, false) %> <%# 其他可选参数也可以写在这里 %> <section class="<%= positionRight ? 'custom-css-class' : '' %>">
另外检查你调用render的代码,你贴的代码末尾多了一个多余的},如果实际代码也存在这个语法错误,会导致参数传递失效,需要删除。
内容的提问来源于stack exchange,提问作者Matt-pow
相关产品推荐
相关产品推荐

