如果.html.erb中的else语句在视图中

dsp*_*099 40 ruby model-view-controller ruby-on-rails

在rails中,我经常会遇到这样的情况:在视图中我会做类似的事情

<% if @some_condition_previusly_established_in_a_controller %>
 <div class="one">123</div>
<% else %>
 <div class="two">something else</div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

它看起来有点乱.这是否是一种可接受的观看方式?

tad*_*man 22

除非你能想出一种方法来重新编写这个作为辅助方法的方法,否则你基本上看起来很难看.这就是ERB的方式,因为它是将Ruby注入其他纯文本模板的最小方式,而不是必须简化或优雅的东西.

好消息是语法高亮的编辑器通常会使您的<% ... %>ERB块看起来与HTML在视觉上不同,因此可以显着提高可读性.

这也是为什么像HAML这样的其他表示被创建的地方,其语法不那么杂乱:

- if some_condition_previusly_established_in_a_controller
  .one 123
- else
  .two something else
Run Code Online (Sandbox Code Playgroud)

  • 那种东西是我更喜欢HAML而不是ERB的原因.HAML摆脱了混乱. (2认同)

vee*_*vee 9

对于你的视图中的一个或两个这样的条件逻辑,我猜它很好但是当你的代码变大并且你有多个if..else..end并且看起来"杂乱"时,我认为你应该看看实现"Presenter Pattern",它通过分离来大大清理你的视图你对演示者的逻辑.

这是我在Ryan Bates的Rails Casts系列中关于"从头开始的Presenter Patterns"的精彩教程. http://railscasts.com/episodes/287-presenters-from-scratch.


ajt*_*dev 5

你有没有尝试过?

<% @some_condition_previusly_established_in_a_controller ? <div class="one">123</div> : <div class="two">something else</div> %>
Run Code Online (Sandbox Code Playgroud)

  • 这不是有效的 ERB。语法错误的答案。 (2认同)

小智 5

如果您的视图包含很多标记和HTML元素,则可以将它们放入部分中,并将逻辑放入模型中

视图:

<%= render :partial => @model.status %>

<%= render :partial => "file/path/#{@model.status}" %> # if your partial is in some different folder
Run Code Online (Sandbox Code Playgroud)

如果您的状态为1,则它将呈现文件_one.html.erb

如果为2,则它将自动呈现文件_two.html.erb。

模型:

def status
    if @some_condition
      "one"
    else
      "two"
    end
end
Run Code Online (Sandbox Code Playgroud)