新手问题 Rails 如何做到不在 view 里放大量条件判断或循环代码?

metheno · 2017年08月08日 · 最后由 nouse 回复于 2017年08月09日 · 1715 次阅读

事情是这样的,最近刚刚开始学 Ruby 和 Rails 框架,同时也是一个编程新手。以前是写 HTML 和 CSS 的,患有重度强迫症。

<% if @user.articles.any? %>
  <% @articles.each do |club| %>
    <%= link_to articles.name, articles_path(articles) %>
  <% end %>
<% else %>
  ...
<% end %>

上面是我在 Views 里面写的一小段判断用的代码。

现在 Views 里充斥着大量这样的判断的代码,我觉得非常闹心 (╯°□°)╯︵ ┻━┻。

想问问各位老手们有没有办法能把这些条件判断放到 controller 或者 helper 里之类的,如果可以的话求推荐几个例子或者教程_(:з」∠)_

非常感谢 (*/ω\*)

这个例子没必要改,别的写法更复杂。

挺好的,直观简单,没必要改啊。写到 helper 还得回头翻来翻去找代码

不过这代码有问题:

<% if @user.articles.any? %>
  <% @articles.each do |club| %>

判断 @user.articles.any? 却遍历了 @articles,到底用哪个?

如果就这么一两条操作按钮,写 view 里面就好了。如果要判断用户的各种权限,有可能有十几条操作按钮。你可以把它移到 helper 文件里面。然后传 record,current_user 过去,返回 html 片段就好了,如果在 view 里面判断逻辑非常多,看着真的很闹心,放在 helper 里面,操作更方便点。

  1. 干脆不处理。ruby-china 有的地方就是这么做的。问题也不大。
  2. 用 partial 觉得一块东西很多,有共用性,就可以用 partial。不过这个和 if else 逻辑是没关系。 用 partial 是处理两块代码的复杂,而不是 if else 带来的复杂。

另外 @user.articles.exists? 应该会快一些,any? 要 load 成数组,exists? 触发 query。

其实放 if else 啥的 也没啥不妥,如果你觉得不爽或者逻辑确实太长,影响可读性,可以用把具体逻辑封装进子视图

<% if condition %>
  <%= render 'view1' %>
<% elsif condition2 %>
  <%= render 'view2' %>
<% else %>
  <%= render 'view3' %>
<% end %>

另外像通知这种类型的内容,可以采用 Tell, don't ask principal 来组织代码

<%= render 'notice' %>

在 notice 里去处理是否渲染

<% next if flash.empty? %>

...

或者封装 helper render_notice

Avid Grimm 倡导用 exhibit objects 来解决。看这里 http://objectsonrails.com/#ID-2656c30c-080a-4a4e-a53e-4fbaad39c262

改成 haml 就没那么闹心了 😄

10 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号