在 Rails 中,我经常遇到这样的情况,在视图中我会做类似的事情
<% if @some_condition_previusly_established_in_a_controller %>
<div class="one">123</div>
<% else %>
<div class="two">something else</div>
<% end %>
它看起来有点混乱。这是一种可接受的处理视图的方式吗?
在 Rails 中,我经常遇到这样的情况,在视图中我会做类似的事情
<% if @some_condition_previusly_established_in_a_controller %>
<div class="one">123</div>
<% else %>
<div class="two">something else</div>
<% end %>
它看起来有点混乱。这是一种可接受的处理视图的方式吗?
除非您能想出一种方法将其重写为辅助方法,否则您基本上会被它看起来有点难看。这就是 ERB 的样子,因为它旨在成为将 Ruby 注入其他纯文本模板的最小方式,而不是必然是流线型或优雅的东西。
好消息是语法高亮编辑器通常会使您的<% ... %>
ERB 块在视觉上与您的 HTML 不同,从而可以显着提高可读性。
这也是为什么创建了其他表示(如HAML )的原因,其中语法不那么混乱:
- if some_condition_previusly_established_in_a_controller
.one 123
- else
.two something else
对于您视图中的一两个这样的条件逻辑,我想它很好,但是当您的代码变得更大并且您有多个if..else..end
并且看起来“混乱”时,我认为您应该考虑实现“Presenter Pattern”,它通过分离大大清理您的视图您对演示者的逻辑。
这是我从 Ryan Bates 在他的 Rails Casts 系列“从头开始演示者模式”中遵循的一个很棒的教程。 http://railscasts.com/episodes/287-presenters-from-scratch。
你有没有尝试过?
<% @some_condition_previusly_established_in_a_controller ? <div class="one">123</div> : <div class="two">something else</div> %>
如果您的视图包含大量标签和 HTML 元素,您可以将它们放入部分中,并将逻辑放入模型中
看法:
<%= render :partial => @model.status %>
<%= render :partial => "file/path/#{@model.status}" %> # if your partial is in some different folder
如果您的状态为 1,那么它将呈现文件 _one.html.erb
如果是 2,那么它会自动渲染文件 _two.html.erb。
模型:
def status
if @some_condition
"one"
else
"two"
end
end
是的,这是标准(是的,它看起来很混乱)。
如果您正在寻找可能更清洁的替代方案,请查看:Rails / ERB 中的条件标签包装
您始终可以将逻辑移动到控制器并保持视图干净(呃)。
控制器:
if @some_condition
@div_class = :one
@div_content = 123
else
@div_class = :two
@div_content = 'something else'
end
看法:
<div class="<%= @div_class %>"><%= @div_content %></div>
或使用助手:
<%= content_tag :div, @div_content, class: @div_class %>