Rails ERB模板IF判断语句优化:避免重复执行计算逻辑
优化方案
你可以通过缓存product.value的返回值避免重复调用,以下是几种常用的实现方式:
方案1:局部变量缓存(最直观,兼容性最好)
先把方法返回值存到局部变量,后续判断和渲染都复用这个变量,全程只会调用一次product.value:
<%# 仅调用一次product.value,结果存入局部变量 %> <% product_val = product.value %> <%# 用Rails内置的content_tag生成HTML,不需要手动拼接和加html_safe,更安全 %> <%= content_tag(:p, product_val, class: "...") if product_val.present? %>
这里用
present?代替直接判断if product_val,可以避免返回空字符串时渲染出无内容的空p标签。
方案2:单行简化写法(适合Rails 5+ 版本)
用then方法省去单独声明局部变量的步骤,逻辑和方案1完全一致:
<%= product.value.then { |val| content_tag(:p, val, class: "...") if val.present? } %>
方案3:模型层封装(适合多场景复用)
如果这个渲染逻辑需要在多个地方用到,可以直接封装到Product模型的实例方法里:
# app/models/product.rb class Product < ApplicationRecord # 其他逻辑... def formatted_value val = value return unless val.present? content_tag(:p, val, class: "...").html_safe end end
之后ERB模板里直接调用即可,代码更简洁:
<%= product.formatted_value %>
内容的提问来源于stack exchange,提问作者almo
相关产品推荐
相关产品推荐

