到目前為止,看過樣版或版型上用過一些如link_to、form_for、form_tag、stylesheet_link_tag、javascript_include_tag等輔助方法,輔助方法用來處理頁面中小段邏輯或結合程式選項產生HTML標籤使用。
Rails內建了許多輔助方法,這些輔助方法組織在 ActionView::Helpers 中的各個模組中,舉例來說,與模型物件有關的form_for等輔助方法,是由 ActionView::Helpers::FormHelper 模組所定義,form_tag等表單標籤輔助方法,是由 ActionView::Helpers::FormTagHelper 所定義,多觀看一些應用程式範例,是得知有哪些常用輔助方法的方式,例如simple_format、truncate、raw、sanitize也是常用的一些輔助方法。至於想要知道某個輔助方法細節上如何使用,可至 http://api.rubyonrails.org/ 查詢,從 Rails Form Helpers 開始也是個不錯的開始。
在樣版或版型中,如果內嵌的程式碼較為冗長或複雜,可以考慮定義為輔助方法。例如:
<% if params[:user] == "Justin" and params[:passwd] == "123456" and params[:token] == "XYZ" %>
admin data here.
<% end %>
如果可以定義為:
<%
def admin?(p)
p[:user] == "Justin" and p[:passwd] == "123456" and p[:token] == "XYZ"
end
%>
<% if admin? params %>
admin data here.
<% end %>
那麼if的部份會清楚許多,然而Rails對於內嵌Ruby是使用eval運算,因此實際上不會這樣定義輔助方法。如果想定義輔助方法,可以將該方法定義在app/helpers的任一rb檔案的模組中,通常某控制器呈現畫面時要定義的輔助方法,會定義在同名的rb檔案中,例如bookmarks控制器呈現畫面時要使用的輔助方法,會定義在bookmarks_helper.rb中,像是:
- bookmarks_helper.rb
module BookmarksHelper
def admin?(p)
p[:user] == "Justin" and p[:passwd] == "123456" and p[:token] == "XYZ"
end
end
如上定義之後,樣版中就可以直接:
<% if admin? params %>
admin data here.
<% end %>
實際上對畫面呈現而言,無論定義在哪個檔案中,所有的樣版中都可以取用,定義在對應的檔案名稱與模組中,只是組織上的方便,如果是共用的輔助方法,通常定義在application_helper.rb的ApplicationHelper模組中。
定義在app/helpers各檔案中的輔助方法,如果想在控制器中使用,必須以ApplicationController.helpers作前置,例如ApplicationController.helpers.admin? params,如果在Rails console中,可以使用helper作前置,例如helper.admin? params。
如果有個現成模組中某些方法不錯用,想作為頁面輔助方法,可以在控制器使用helper方法指定。例如若有個模組定義:
module ABC
def some
...
end
end
你想讓模組ABC中的some方法,可以作為頁面的輔助方法,則可以在控制器中:
class TestsController < ActionController::Base
helper ABC
...
end
如此一來,透過該控制器呈現的頁面中,就可以直接使用some作為輔助方法。例如:
<%= some %>
如果必須先作require、include的模組,可以如下:
class TestsController < ActionController::Base
helper :orz
...
end
class TestsController < ActionController::Base
helper "xyz/orz"
...
end
也可以直接在helper的程式區塊中,指定透過該控制器呈現的頁面中可用的輔助方法。例如:
helper do
def xyz
...
end
end
...
end