Rails 曾經(jīng)迷惑的小知識一

以下都是參考自:Ruby on Rails 實戰(zhàn)圣經(jīng)辐烂,里面有很多好用的小知識样傍,也是曾經(jīng)走過的坑,一點點知道的蔫磨,這里面給整理的很好。已經(jīng)一字不差的讀到 Part 2 第 10 個了圃伶,接下來繼續(xù)堤如。因為都是地鐵上看的蒲列,所以,就今天摘了一些我曾經(jīng)迷惑過的小知識下來搀罢。

  1. <%- -%> 有什么作用蝗岖?
<% @people.each do |person| %>
  <% if person.name.present? %>
    <p><%= person.name %></p>
  <% end %>
<% end %>

上述的 <% %> 標(biāo)簽雖然不會輸出 HTML 內(nèi)容,但是還是在 HTML 原始碼中換行了榔至,為了避免輸出時多余的換行抵赢,可以改用 <%- -%>。不過實際上并沒有很多人在乎就是了唧取,畢竟這不影響用戶的頁面铅鲤。

  1. 設(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
  1. Collection

如果是列表集合,像是 trli 這類會一直重復(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í)行效率最佳化袜漩。

  1. Helper
    因為 Helper 預(yù)設(shè)只能在 Template 中使用绪爸,如果想在 rails console 中呼叫,必須加上 helper宙攻,例如 helper.link_to奠货。另外,雖然機(jī)會不多座掘,如果真的要在Rails Controller或Model程式中呼叫Helper递惋,則可以加上ApplicationController.helpers前置詞

Helper是全域的溢陪,定義在哪一個檔案中沒有關(guān)系萍虽,檔案名稱也不需要與Controller名稱對應(yīng)。

  1. 靜態(tài)檔案輔助方法
    使用 Rails 內(nèi)建的靜態(tài)檔案(Assets)輔助方法有幾個好處:

Rails 會合并 StylesheetJavasSript 檔案形真,可以加速瀏覽器的下載杉编。
Rails 會編譯 SassCoffeeScript 等透過 Assets template engine 產(chǎn)生的 StylesheetJavasSript
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
  1. 格式化輔助方法
    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"
  1. 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 效果

  1. 表單輔助方法
    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用了一個隱藏欄位來處理反勾選墩邀。

  1. 如何處理 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 本來的欄位一起處理了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坊萝,一起剝皮案震驚了整個濱河市孵稽,隨后出現(xiàn)的幾起案子许起,更是在濱河造成了極大的恐慌,老刑警劉巖菩鲜,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件园细,死亡現(xiàn)場離奇詭異,居然都是意外死亡接校,警方通過查閱死者的電腦和手機(jī)猛频,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛛勉,“玉大人鹿寻,你說我怎么就攤上這事》塘瑁” “怎么了毡熏?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侣诵。 經(jīng)常有香客問我痢法,道長,這世上最難降的妖魔是什么杜顺? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任疯暑,我火速辦了婚禮,結(jié)果婚禮上哑舒,老公的妹妹穿的比我還像新娘妇拯。我一直安慰自己,他們只是感情好洗鸵,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布越锈。 她就那樣靜靜地躺著,像睡著了一般膘滨。 火紅的嫁衣襯著肌膚如雪甘凭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天火邓,我揣著相機(jī)與錄音丹弱,去河邊找鬼。 笑死铲咨,一個胖子當(dāng)著我的面吹牛躲胳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纤勒,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坯苹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摇天?” 一聲冷哼從身側(cè)響起粹湃,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤恐仑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后为鳄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裳仆,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年孤钦,在試婚紗的時候發(fā)現(xiàn)自己被綠了鉴逞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡司训,死狀恐怖构捡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壳猜,我是刑警寧澤勾徽,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站统扳,受9級特大地震影響喘帚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咒钟,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一吹由、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朱嘴,春花似錦倾鲫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壤追,卻和暖如春磕道,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背行冰。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工溺蕉, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悼做。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓疯特,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贿堰。 傳聞我的和親對象是個殘疾皇子辙芍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353