使用ajax異步提交表單
在rails中只能使用type=submit
的button來(lái)提交有data-remote=true
屬性的ajax的表單。如果使用type=button
的按鈕提交表單則只能通過(guò)js(document.formname.submit()
)提交,此時(shí)會(huì)變成同步提交而非ajax。escape_javascript
和simple_format
2.1 當(dāng)數(shù)據(jù)庫(kù)中的字段有換行符,引號(hào)等特殊字符時(shí)使用$(input).val("<%= @data %>")
獲取數(shù)據(jù)會(huì)導(dǎo)致js語(yǔ)法錯(cuò)誤,此時(shí)可以使用$(input).val("<%== escape_javascript @data %>”)
來(lái)將ruby轉(zhuǎn)換成安全的js
http://stackoverflow.com/questions/18854749/escape-string-ouput-rails-string-in-javascript
2.2 在html中直接顯示數(shù)據(jù)庫(kù)中的\n等特殊字符時(shí),可以使用<%= simple_format(@data) %></p>或<p><%= @data.html_safe %>
來(lái)進(jìn)行安全的轉(zhuǎn)換string轉(zhuǎn)換成時(shí)間戳
require 'time'
timestamp = Time.parse("2011-05-19 10:30:14").to_i
flash
rails中的flash和flash.now可以保存一次請(qǐng)求過(guò)程的內(nèi)容
flash[:notice]
的內(nèi)容可以保持到下一次的action
flash.now[:notice]
的內(nèi)容只用于當(dāng)次渲染viewprotect_from_forgery
從rails 2.0 開(kāi)始默認(rèn)開(kāi)啟(protect_from_forgery),目的在于防止CSRF(Cross-Site Request Forgery)攻擊。
rails為了保證當(dāng)前的請(qǐng)求是來(lái)自自己的請(qǐng)求,而不是通過(guò)其他網(wǎng)站偽造的請(qǐng)求,都會(huì)在生成的form 里加入一個(gè)隱藏的token值,只有非get請(qǐng)求才會(huì)附帶token
<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %>
當(dāng)然如果你認(rèn)為你的action確實(shí)不需要驗(yàn)證,那可以這么寫:
#除了index,controller里的其他action都需要驗(yàn)證
protect_from_forgery :except => :index
#只有index需要驗(yàn)證
protect_from_forgery :only => :index
只需要在controller中加入protect_from_forgery就可以開(kāi)啟防csrf攻擊機(jī)制,這會(huì)導(dǎo)致在前端提交的form中自動(dòng)加入token并在后端驗(yàn)證,非常方便
關(guān)于params的問(wèn)題
對(duì)于一個(gè)界面,第一次渲染時(shí)沒(méi)有params這個(gè)參數(shù)集合,就是說(shuō)params[:any]
都是nil;在以后的渲染過(guò)程中在表單中為空的參數(shù)被當(dāng)做空字符串傳到后端也即params[:not_fill] == ''
如果前端傳來(lái)的params[:loss_money]=''
而數(shù)據(jù)庫(kù)中l(wèi)oss_money為decimal類型,則賦值時(shí)case.loss_money = params[:loss_money]
會(huì)被轉(zhuǎn)換成null
,解決方式是寫為case.loss_money = params[:loss_money].to_f
這樣null
會(huì)被轉(zhuǎn)化為0.00-
局部視圖出現(xiàn)兩次的問(wèn)題
rails中使用render進(jìn)行局部視圖渲染時(shí),如果渲染的內(nèi)容在頁(yè)面中出現(xiàn)兩次,則有可能是.js.erb文件中選擇的元素不對(duì):$("#case_table_body").html("<%= escape_javascript(render :partial => 'cases_table')%>”)
case_table_body應(yīng)該是主頁(yè)面中的元素 在ajax請(qǐng)求中重定向到其他頁(yè)面
render :js => "window.location = '/jobs/index'"
在form中如果有
type=file
的input的話data-remote=true
就不會(huì)生效了,可以使用remotipart這個(gè)gem來(lái)解決使用tab切換顯示內(nèi)容時(shí)前后端傳遞
params[:tab]
比較難以控制,可以使用jQuery在點(diǎn)擊事件中修改tab的active狀態(tài)使用
<%= simple_format(@data) %>
來(lái)轉(zhuǎn)換后端傳到前端的數(shù)據(jù)
(http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format)
simple_format
根據(jù)一些規(guī)則將后端的字符串轉(zhuǎn)換成前端的HTML。多個(gè)\n
被認(rèn)為是一個(gè)新段落,被包在<p>
標(biāo)簽中。一個(gè)\n
被認(rèn)為是一個(gè)新行,被轉(zhuǎn)換成<br/>
- 關(guān)于
html_safe
、raw
、sanitize
和h()
(www.lxweimin.com/p/ZLpFSy) - 當(dāng)打印日志出現(xiàn)問(wèn)題時(shí)(
log writing failed. "\xE6" from ASCII-8BIT to UTF
)可以將log內(nèi)容強(qiáng)制轉(zhuǎn)碼成utf-8進(jìn)行打印
custom_logger.info "resp: #{resp.force_encoding('UTF-8')}"