以下都是參考自:Ruby on Rails 實戰(zhàn)圣經(jīng)辐烂,里面有很多好用的小知識样傍,也是曾經(jīng)走過的坑,一點點知道的蔫磨,這里面給整理的很好。已經(jīng)一字不差的讀到 Part 2 第 10 個了圃伶,接下來繼續(xù)堤如。因為都是地鐵上看的蒲列,所以,就今天摘了一些我曾經(jīng)迷惑過的小知識下來搀罢。
-
<%- -%>
有什么作用蝗岖?
<% @people.each do |person| %>
<% if person.name.present? %>
<p><%= person.name %></p>
<% end %>
<% end %>
上述的 <% %>
標(biāo)簽雖然不會輸出 HTML
內(nèi)容,但是還是在 HTML
原始碼中換行了榔至,為了避免輸出時多余的換行抵赢,可以改用 <%- -%>
。不過實際上并沒有很多人在乎就是了唧取,畢竟這不影響用戶的頁面铅鲤。
- 設(shè)定 layout
# Controller 設(shè)定 layout
layout "special", only: :index
layout "special", except: [:show, :edit, :new]
# Action 中設(shè)定 layout
def show
@event = Event.find(params[:id])
render layout: "foobar"
end
- Collection
如果是列表集合,像是 tr
或 li
這類會一直重復(fù)的 Template
元素枫弟,我們可以使用collection
參數(shù)來處理彩匕,例如像以下的程式:
<ul>
<% @people.each do |person| %>
<%= render :partial => "person", :locals => { :person => person } %>
<% end %>
<ul>
我們可以改寫成使用 collection
參數(shù)來支援列表集合:
<ul>
<%= render :partial => "person", :collection => @people, :as => :person %>
<ul>
在 _person.html.erb
這個 partial
中,會有有一個額外的索引變量 person_counter
記錄編號媒区。
使用 collection
的好處不只是少打字而已驼仪,還有執(zhí)行效能上的大大改善,Rails
內(nèi)部會針對這種形式做執(zhí)行效率最佳化袜漩。
- Helper
因為Helper
預(yù)設(shè)只能在Template
中使用绪爸,如果想在rails console
中呼叫,必須加上helper
宙攻,例如helper.link_to
奠货。另外,雖然機(jī)會不多座掘,如果真的要在Rails Controller或Model程式中呼叫Helper递惋,則可以加上ApplicationController.helpers前置詞。
Helper是全域的溢陪,定義在哪一個檔案中沒有關(guān)系萍虽,檔案名稱也不需要與Controller名稱對應(yīng)。
- 靜態(tài)檔案輔助方法
使用Rails
內(nèi)建的靜態(tài)檔案(Assets)輔助方法有幾個好處:
Rails
會合并 Stylesheet
和 JavasSript
檔案形真,可以加速瀏覽器的下載杉编。
Rails
會編譯 Sass
和 CoffeeScript
等透過 Assets template engine
產(chǎn)生的 Stylesheet
和 JavasSript
Rails
會在靜態(tài)檔案網(wǎng)址中加上時間序號,如果內(nèi)容有修改則會重新產(chǎn)生咆霜。這樣的好處是強(qiáng)迫用戶的瀏覽器一定會下載到最新的版本邓馒,而不會有瀏覽器快取到舊版本的問題。
變更 Assets host
主機(jī)位址時蛾坯,可以一次搞定光酣,例如上 CDN
時。透過 Helpers
脉课,Rails
可以幫所有的 Assets
加上靜態(tài)檔案伺服器網(wǎng)址救军。
幾個常用的方法:
javascript_include_tag
stylesheet_link_tag
auto_discovery_link_tag
favicon_link_tag
image_tag
video_tag
audio_tag
- 格式化輔助方法
simple_format
將\n
換行字元換成HTML的<br>
標(biāo)簽改览。在表單輸入的<textarea></textarea>
中,換行其實是\n
控制字元缤言,因此輸出在網(wǎng)頁上時宝当,\n
代表的是在HTML原始碼中換行,因此我們經(jīng)常需要將\n
再換成<br>
標(biāo)簽胆萧,這樣瀏覽器看到的畫面才有換行的呈現(xiàn)庆揩。
<%= simple_format("foo\nbar") %>
# 輸出 "<p>foo\n<br />bar</p>"
truncate 截取前幾個字符
<%= truncate("Once upon a time in a world far far away") %>
# 輸出 "Once upon a time in a world..."
<%= truncate("Once upon a time in a world far far away", length: 17) %>
# 輸出 "Once upon a ti..."
strip_tags
移除HTML標(biāo)簽
strip_links
移除HTML超連結(jié)標(biāo)簽
distance_of_time_in_words
輸出很酷的時間距離,例如
distance_of_time_in_words(Time.now, Time.now + 60.minutes)
=> "about 1 hour"
distance_of_time_in_words_to_now
distance_of_time_in_words_to_now(Time.now - 1.second)
=> "less than a minute"
time_tag
輸出HTML5時間標(biāo)簽
time_tag(Time.now)
=> "<time datetime=\"2014-11-03T23:55:11+08:00\">November 03, 2014 23:55</time>"
number_with_delimiter
number_with_delimiter(1234567)
=> "1,234,567"
number_with_precision
number_with_precision(123.4567, precision: 2)
=> "123.46"
- URL輔助方法
link_to
文字超連結(jié)
除了學(xué)過的<%= link_to '超連結(jié)文字', xxx_path %>
用法之外跌穗,如果超連結(jié)文字很多甚至有圖片订晌,可以用block
的方式改寫,例如:
<%= link_to user_path(user) do %>
<%= image_tag user.avatar.url %> <%= user.display_name %>
<% end %>
mail_to
E-mail
button_to
按鈕連結(jié)蚌吸,這個預(yù)設(shè)會改用POST出去(實際是個只有按鈕的表單)锈拨。因此如果超連結(jié)有用 method: :post
等非GET方法時,建議可以考慮改用 button_to
而不是 link_to
羹唠,這樣在JavaScript失效的情況下仍然可以作用奕枢,滿足網(wǎng)頁無障礙的標(biāo)準(zhǔn)。
current_page?(url)
是否目前是url這個頁面佩微,通常是在 layout
上搭配 tab
樣式做 active
效果
- 表單輔助方法
select
使用select
有一個坑:如果你要加class
的話缝彬,必須這樣寫f.select :xxx, {}, :class => "your-class-name"
,多出來的{}是因為這個select API的最后兩個參數(shù)都是Hash哺眯,必須多包一個{}
才能讓:class
擠到最后的參數(shù)去谷浅。
搭配model用的f.check_box :column_name和check_box_tag :input_name有微妙的差異,前者會多產(chǎn)生一個隱藏的hidden_field :column_name, "0"來表示沒有勾選的狀態(tài)奶卓,后者則不會一疯。這是因為如果你沒有勾選的話,瀏覽器就不會送出check_box的資料夺姑,因此Rails用了一個隱藏欄位來處理反勾選墩邀。
- 如何處理
Model
中不存在的屬性
使用form_for
時,其中的欄位必須是Model
有的屬性瑟幕,那如果資料庫沒有這個欄位呢?這時候你依需要在Model
程式中加上存取方法磕蒲,例如:
class Event < ApplicationRecord
#...
def custom_field
# 根據(jù)其他屬性的值或條件留潦,來決定這個欄位的值
end
def custom_field=(value)
# 根據(jù)value只盹,來調(diào)整其他屬性的值
end
end
這樣就可以在 form_for
里使用 custom_field
了。
<%= form_for @event do |f| %>
<%= f.text_field :custom_field %>
<%= f.submit %>
<% end %>
記得把 :custom_field
也加到 Strong Parameters
清單里兔院,這樣按下送出后殖卑,就可以跟著 @event
本來的欄位一起處理了。