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