rails問(wèn)題總結(jié)

  1. 使用ajax異步提交表單
    在rails中只能使用type=submit的button來(lái)提交有data-remote=true屬性的ajax的表單。如果使用type=button的按鈕提交表單則只能通過(guò)js(document.formname.submit())提交,此時(shí)會(huì)變成同步提交而非ajax。

  2. escape_javascriptsimple_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)換

  3. string轉(zhuǎn)換成時(shí)間戳

require 'time'
timestamp = Time.parse("2011-05-19 10:30:14").to_i
  1. flash
    rails中的flash和flash.now可以保存一次請(qǐng)求過(guò)程的內(nèi)容
    flash[:notice]的內(nèi)容可以保持到下一次的action
    flash.now[:notice]的內(nèi)容只用于當(dāng)次渲染view

  2. protect_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)證,非常方便

  1. 關(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

  2. 局部視圖出現(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è)面中的元素

  3. 在ajax請(qǐng)求中重定向到其他頁(yè)面

    render :js => "window.location = '/jobs/index'"
  1. 在form中如果有type=file的input的話data-remote=true就不會(huì)生效了,可以使用remotipart這個(gè)gem來(lái)解決

  2. 使用tab切換顯示內(nèi)容時(shí)前后端傳遞params[:tab]比較難以控制,可以使用jQuery在點(diǎn)擊事件中修改tab的active狀態(tài)

  3. 使用<%= 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/>

  1. 關(guān)于html_saferawsanitizeh()www.lxweimin.com/p/ZLpFSy
  2. 當(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')}" 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 個(gè)人自行閱讀時(shí)候,翻譯的文檔。因?yàn)楸容^渣,如果有更合理或者錯(cuò)誤的地方煩勞告知,我會(huì)做修改。Oracle Data ...
    窩窩的小黑屋閱讀 1,252評(píng)論 0 3
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,949評(píng)論 0 23
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,993評(píng)論 19 139
  • 浮屠塔上的明珠還在閃亮 看盡三世的紅塵 離不開(kāi)一個(gè)情 拼命的掙扎 卻妄想逃過(guò)命運(yùn)的掌心 玩弄在鼓掌的是迷路的...
    日晨閱讀 216評(píng)論 0 0
  • 今天是新年第六天,六寓意六六大順!愿我天岑在新的一年事事順利!愿我所有親人朋友事事順利! 愿所有上簡(jiǎn)書(shū)的朋友都六六...
    沙侖de玫瑰閱讀 256評(píng)論 1 1