view
view分為 builder模式和rhtml模式
builder模式例子如下,rails內建
xml.div(:class => "productlist") do
xml.timestamp(Time.now)
@products.each do |product|
xml.product do
xml.productname(product.title)
xml.price(product.price, :currency => "USD")
end
end
end
如果標記和內建方法重複,可以使用something!()來產生標記
rhtml類似於jsp, <%=...%>輸出 <%...%>純標記 <%...-%>自動刪除自己的空行
h方法提供了html encoding
Helper
XXXController都會對應一個 XXXHelper(xxx_helper.rb)來寫協助方法, 這些方法在rhtml中都可見
要實現跨controller調用,可以
* 在application_helper.rb中寫方法
* 在controller中通過helper :some_helper.rb匯入
* 在controller中通過helper SomeHelper匯入(類已經栽入的情況下)
通過helper_method 還可以把controller中的方法變為helper,但是這樣作不推薦,破壞封裝
rails內建了很多helper可用,比如各種單位的換算helper(對view特別有意義),詳情查閱rdoc 特別的helper有
* debug 把對象以html可見的方式列印在頁面,方便調試
* simeple_format 簡單的格式化string,添加
段落和
* excerpt 給字元兩邊添加... "...Some words fo..."
* highlight(string,highword) 添加...
* truncate(sring,maxlen) 給字元右邊添加... "hello this is my..."
* pluralize(num,word) 自動添加複數形式 1 person -> 2 people
* markdown 文章filter
* texttile 文章filter
處理連結
link_to "xxxx",{hash},{hash}
第一個是連結文字,第二個hash和url_for的一樣,第三個hash是使用者自己在<a>中添加的標籤,比如
<%= link_to "Delete", { :controller => "admin",
:action => "delete",
:id => @product
},
{ :class => "redlink",
:confirm => "Are you sure?"
}
%>
button_to 的參數和link_to一樣, 產生一個button來跳轉(安全的POST協議),但是button_to要單獨在一個form裡面,html不允許嵌套form
link_to_unless_current 自動識別當前連結, 如果當前url和連結一樣, 就只產生文本
image_tag嵌套進入link_to
mail_to 有一個:encode=>"javascript" 可以實現把email地址編碼防spider
stylesheet_link_tag 添加css
auto_descovery_link_tag 自動申明rss
預設所有的image在/images css在/stylesheets,除非顯示使用/xxx來指定根路徑另外可以修改 ActionController::Base.asset_host = "http://media.my.url/assets" #共同的prefix 這樣可以實現靜態內容專門在一一起
分頁
分頁涉及到controller和view兩個部分在controller中 Paginator對象, 專門負責分頁 ,預設分頁為10個一頁
@user_pages, @users=paginate(:users,:order_by =>'name')
在頁面裡面使用<%=pagination_links(@user_pages)%> 會自動產生頁面連結
詳情查閱RDoc
表單處理
本質上rails是簡單的把上行的參數設定為層次分明的hash(aaa.bbb.ccc 映射為 aaa[bbb][ccc]), 這樣來和activerecord自動交換資料,但是也可以直接讀取之
param[:xx][:yy] rails推薦以symbol來讀取(string也可以)
大多數輸入helper前兩個參數分部是:variable和:attribute ,最後一個是增加的html options 例子如下 <%=xxx_field :variable,:attribute,options_hash%>
注意 update_attribute會自動調用save方法
表單處理 FormHelper中的方法(和Model綁定)
普通輸入框
* text_field
* hidden_field
* password_field
*
text_area
*
radio_button 第三個參數是tag_value,當他和value相等的時候顯示為selected
* check_box value必須為true/false或者轉換為int的值(非0為true) 倒數兩個參數為on_value和off_value 為開啟/關閉時提交的值, 預設為"1","0"
列表
select(:variable, :attribute,choices,options,html_options)
choice參數為enumerable,當enumerable的元素為[a,b]這樣的長度為2數組的時候,數組第一個元素為value,第二個為key
collection_select(:variable,:attribute,choices,:inner_attr_for_key,:inner_attr_for_value)專門用來列表集合
分組列表
暫時不看 @@@
日期輸入框
date_select(:variable,:attribute,options) datetime_select(..)是處理和model相關的日期
select_xxx 是處理普通日期(直接通過params訪問)
沒有怎麼看明白有什麼用處
上傳檔案
form中需要添加:multipart=>true,本質上然後通過對應的參數獲得資料(一個StringIO) 通過read即可讀取全面內容到string中然後就相當於拿到檔案內容處理了
錯誤處理
上門的helper參數都會自動讀取對於field的錯誤資訊(errors.on(field)),發現錯誤以後會自動產生一個class=fieldWithErrors的div,通過css可以控制顯示. 如果需要直接讀取某個field的錯誤資訊, 可以使用<%= error_message_on(:bean,:field)%>,讀取所有錯誤使用<%= error_messages_for(:bean)%>
FormTagHelper 和Model無關的方法
FormTagHelper中的方法都比Form中多一個_tag結尾
* start_form_tag和end_form_tag form開始結束
* submit_tag 提交按鈕
其他FormHelper中的協助方法都有一個對應的_tag版本,參數接受 :name,value,html_options
例子如下
<%=text_field_tag(:arg1,@params[:args],:size=>3)%>
layout技術 (sitemesh式的模板)
layout模板中可以訪問所有對應頁面中能訪問的對象,還多有@content_for_layout參數來指向整個頁面輸出的內容
自動尋找: 一個xxx_controller對應了一個在layout下同名的xxx.rhtml/rxml作為他的layout,
顯式申明:
1. 在controller中通過layout申明一個string, 支援:except和:only參數(過濾:action名)
2. 聲明為nil表示關閉layout
3. 申明為一個:symbol表示通過當前類symbol方法擷取string名
string對應了 string.rhtml或者string.rxml
直接render: 直接調用render(:layout=>"layouts/xxxx")可以使用layout,或者使用:layout=>false關閉layout
partial page template 頁面片斷
頁面片斷的頁面必須以_開頭命名,放在和controller相同路徑下,使用render(:partial=>"xxx",:object=>@newinst)訪問
檔案名稱必須ruby變數規範和檔案名稱普通規範,通過:object注入的參數通過檔案名稱訪問,比如_myname.rhtml就得到了myname這個參數,要追加其他參數,使用:locals={...}
如果忽略:object參數表示把@xxx 自動傳入 _xxx.rhtml中的xxx變數, 也就是當@instance和partial中的變數名相同時候, 可以省略:object
使用集合的partial
通過 render(:partial=>"xxx" ,:collection=>xxx) 可以指定一個集合, 集合中的元素會傳給partial content作為主要元素,同時還會添加一個xxx_counter來作為index, 此時使用:spacer_template=>"yyy"還可以指定兩個元素之間使用的空白template
如果:partial=>"xxx/yyy" 指定的名字含有/ ,那麼rails預設為這個路徑從/app/views開始,通過這個方法可以做到多個controller使用一個partial conetent
components 組件
在頁面中通過render_component使用 render_component(:controller=>'xxx',:action=>'fdas')
需要注意的是要注意避免循環參考,所以一般用來作component的action最好使用render(:layout=>false...)或者在class中申明 layout "xxx","except=>:xxxx
獨立的component組件
* 必須方在components/xxx下面
* 使用XXX::MyController申明 必須在model xxx中
* 類開頭申明uses_component_template_root
* 使用方式為<%%=render_component):controller=>'xxx/my',:action=>'yyy') %>