Ruby on Rails View Helper

除了上⾯提到的局部样版,View Helper 也是⽤来整理程序码很常⽤的⼿法。其实平
常⼤家在写的 link_to 、 image_tag 或是 form_for ,它都是⼀种 View
Helper。
虽然 View Helper 通常是写在 View 的 HTML 标签里,但其实 View Helper 本⾝是标
准的 Ruby 程序码,使⽤起来就跟在呼叫⼀般的 Ruby ⽅法⼀样。
⾃定 View Helper
除了 Rails 内建的⽅法,有时候在专案中也会写⼀些⾃⼰会⽤的⽅法,例如可能有⼀
段程序码长这样:

<tr>
<td>
<% if gender == 1 %>
男
<% elsif gender == 0 %>
女
15 Layout,Render 与 View Helper
235
<% else %>
不想说
<% end %>
</td>
</tr>

当 gender 的值是 1 的时候印出 男 ,是 0 的时候就印出 女 ,不然就印出 不
想说 。虽然像这样的写法很简单也很直觉,但这样就会让 View 开始有⼀些逻辑判
断了,这不是好事。View 的主要⽤途是输出结果在画⾯上,所以逻辑判断越少越
好。像上⾯这个例⼦,我们就可以把这段 if .. else .. 判断,搬到 View
Helper 里放着。
View Helper 主要是放在 app/helpers ⽬录里。要写在哪个档案里都可以(因为
所有的 View Helper 都可以被 Rails 载入),但通常会放在跟功能有关的档案里。这
里我就先把 Helper 写在 app/helpers/application_helper.rb 里⾯:

module ApplicationHelper
def user_gender(gender)
if gender == 1
"男"
elsif gender == 0
"女"
else
"不想说"
end
end
end

View Helper 是定义在 Ruby 的模组(Module)里,Rails 在启动的时候会把这些
View Helper 都载进来,让⼤家在 View 可以直接使⽤。在上⾯这个例⼦,我在
ApplicationHelper 这个模组里定义了⼀个 user_gender ⽅法,⽽且这个⽅法
会接收⼀个参数,并根据参数的内容回传「男」、「女」或「不想说」。有这个
View Helper 之後,原来在 View 的那段 if ... else ... 的逻辑判断就可以改
成这样:

<tr>
<td><%= user_gender(gender) %></td>
</tr>

适时的使⽤ View Helper 把需要逻辑判断的部份抽出来,可以让 View 的程序码变得
乾净⼜清楚。
View Helper 的使⽤规则
虽然 View Helper 的⽅法写在 app/helpers ⽬录下的随便哪个档案都可以,但档
名以及模组名称是有规则的:

  1. 模组名称需为 XXXXHelper ,例如 UserHelper 或是 PostHelper 。
  2. 若模组名称是 UserHelper ,档案名称为 user_helper.rb ;如果是
    PostHelper ,档名则为 post_helper.rb ,依此类推。
  3. 虽然 View Helper 的⽅法要写在哪个 Helper 模组都可以,但模组会按照模组的
    名字的英⽂字⺟顺序依序载入,例如 PostHelper 会比 UserHelper 先载
    入,也就是说如果这两个模组上有名字⼀样的⽅法,先载入⽅法的会被後载入
    的覆盖掉,这点需要特别注意。

参考资料

[为你自己学Ruby on Rails]https://railsbook.tw/chapters/08-ruby-basic-4.html


<<:  每个人都该学的30个Python技巧|技巧 26:搜寻以及取代—find()和replace()(字幕、衬乐、练习)

>>:  Data layer testing (2)

DAY19:进阶清单元件之实作

这次要用所做过的范例来说明,首先,基本的设计画面就不多说了! 设计出後第一页会长这样 按下新增联络人...

番外篇 - NestJs - Guard

NestJs - Guard 验证分为两种,登入权限验证以及角色验证 举例说明:我们将 API 分为...

第二十九天:为 IntelliJ Platform 设计的 TeamCity Plugin

在我们整个系列教学里,所有的操作都是在 TeamCity 的 Web UI 上完成,而 TeamCi...

Web基础篇

先宣传一下我的新书,终於出来惹,感动到无法言语>"< 还请大家多多支持! We...

一些档案格式

在Android 之中,档案类型是使用MIME (Multipurpose Internet Mai...