以下都是参考自:Ruby on Rails 实战圣经,里面有很多好用的小知识,也是曾经走过的坑,一点点知道的,这里面给整理的很好。已经一字不差的读到 Part 2 第 10 个了,接下来继续。因为都是地铁上看的,所以,就今天摘了一些我曾经迷惑过的小知识下来。
<%- -%>
有什么作用?
|
|
上述的 <% %>
标签虽然不会输出 HTML
內容,但是还是在 HTML
原始码中换行了,为了避免输出時多余的換行,可以改用 <%- -%>
。不过实际上并沒有很多人在乎就是了,毕竟这不影响用户的页面。
- 设定 layout
|
|
- Collection
如果是列表集合,像是 tr
或 li
這类会一直重复的 Template
元素,我们可以使用collection
参数來处理,例如像以下的程式:
|
|
我們可以改写成使用 collection
参数來支援列表集合:
|
|
在 _person.html.erb
這個 partial
中,会有有一个额外的索引变量 person_counter
记录编号。
使用 collection
的好处不只是少打字而已,还有执行效能上的大大改善,Rails
內部会针对这种形式做执行效率最佳化。
- Helper
因为Helper
预设只能在Template
中使用,如果想在rails console
中呼叫,必须加上helper
,例如helper.link_to
。另外,虽然机会不多,如果真的要在Rails Controller或Model程式中呼叫Helper,则可以加上ApplicationController.helpers前置词。
Helper是全域的,定义在哪一个档案中没有关系,档案名称也不需要与Controller名称对应。
- 静态档案辅助方法
使用Rails
内建的静态档案(Assets)辅助方法有几个好处:
Rails
会合并 Stylesheet
和 JavasSript
档案,可以加速浏览器的下载。Rails
会编译 Sass
和 CoffeeScript
等透过 Assets template engine
产生的 Stylesheet
和 JavasSript
Rails
会在静态档案网址中加上时间序号,如果内容有修改则会重新产生。这样的好处是强迫用户的浏览器一定会下载到最新的版本,而不会有浏览器快取到旧版本的问题。
变更 Assets host
主机位址时,可以一次搞定,例如上 CDN
时。透过 Helpers
,Rails
可以帮所有的 Assets
加上静态档案伺服器网址。
几个常用的方法:
|
|
- 格式化辅助方法
simple_format
将\n
换行字元换成HTML的<br>
标签。在表单输入的<textarea></textarea>
中,换行其实是\n
控制字元,因此输出在网页上时,\n
代表的是在HTML原始码中换行,因此我们经常需要将\n
再换成<br>
标签,这样浏览器看到的画面才有换行的呈现。
|
|
truncate 截取前几个字符
|
|
strip_tags
移除HTML标签
strip_links
移除HTML超连结标签
distance_of_time_in_words
输出很酷的时间距离,例如
|
|
time_tag
输出HTML5时间标签
|
|
number_with_delimiter
|
|
- URL辅助方法
link_to
文字超连结
除了学过的<%= link_to '超連結文字', xxx_path %>
用法之外,如果超连结文字很多甚至有图片,可以用block
的方式改写,例如:
|
|
mail_to
E-mailbutton_to
按钮连结,这个预设会改用POST出去(实际是个只有按钮的表单)。因此如果超连结有用 method: :post
等非GET方法时,建议可以考虑改用 button_to
而不是 link_to
,这样在JavaScript失效的情况下仍然可以作用,满足网页无障碍的标准。current_page?(url)
是否目前是url这个页面,通常是在 layout
上搭配 tab
样式做 active
效果
- 表单辅助方法
select
使用select
有一个坑:如果你要加class
的话,必须这样写f.select :xxx, {}, :class => "your-class-name"
,多出来的{}是因为这个select API的最后两个参数都是Hash,必须多包一个{}
才能让:class
挤到最后的参数去。
搭配model用的f.check_box :column_name和check_box_tag :input_name有微妙的差异,前者会多产生一个隐藏的hidden_field :column_name, “0”来表示没有勾选的状态,后者则不会。这是因为如果你没有勾选的话,浏览器就不会送出check_box的资料,因此Rails用了一个隐藏栏位来处理反勾选。
- 如何处理
Model
中不存在的属性
使用form_for
时,其中的栏位必须是Model
有的属性,那如果资料库没有这个栏位呢?这时候你依需要在Model
程式中加上存取方法,例如:
|
|
这样就可以在 form_for
里使用 custom_field
了。
|
|
记得把 :custom_field
也加到 Strong Parameters
清单里,这样按下送出后,就可以跟着 @event
本来的栏位一起处理了。