Rails ERB多层IF判断:根据Position字段动态修改H4标题的实现问题
核心疑问解答
- 判断的查询范围完全取决于你写的判断逻辑:
- 如果你写的是模型层面的查询比如
Person.exists?(position: 'Office2'),会直接查询整张people表,和当前已加载的@people无关 - 如果你写的是集合方法比如
@people.any? { |p| p.position == 'Office2' },只会遍历已经拉取到内存的@people记录,不会触发新的数据库查询
- 不需要在H4外层包裹IF语句,更不要把判断写在
@people.each循环内部——这个判断全局只需要执行一次,循环内重复执行属于冗余逻辑。
实现方案
推荐把判断逻辑提前放到控制器中计算,避免视图层掺杂业务逻辑:
# 控制器对应Action中,赋值@people之后加这行 # 方案1:判断全表是否存在Office2职位 @show_co_office = Person.exists?(position: 'Office2') # 方案2:仅判断当前@people集合中是否存在Office2职位,无额外SQL查询 # @show_co_office = @people.any? { |person| person.position == 'Office2' }
修改视图代码,同时修复原代码中person_path未传参的bug:
<li> <% # 提前筛选出所有Office1的人员,预计算标题内容 %> <% office1_persons = @people.select { |person| person.position == 'Office1' } %> <% office_title = @show_co_office ? 'Co-Office' : 'Office' %> <% office1_persons.each do |person| %> <div class="image"> <%= link_to person_path(person) do %> <%= image_tag("profiles/#{person.uname}S.jpg") %> <% end %> </div> <div class="body2"> <h4><%= office_title %></h4> <%= link_to person_path(person) do %> <h5><%= person.fname %> <%= person.lname %></h5> <% end %> </div> <% end %> </li>
如果你的场景里Office1和Office2永远是绑定出现的联合职位,还可以进一步把职位映射逻辑抽到模型层的Helper方法里,后续修改职位规则的时候不用改视图和控制器。
内容的提问来源于stack exchange,提问作者Argent
相关产品推荐
相关产品推荐

