rails3.0刪除失效問題

來源:互聯網
上載者:User

        以前碰到過這個問題,在別人的協助下解決了。最近又幫人解決這個問題,花費了大半天時間,也算解決了,記錄下,防止以後忘了。
        問題癥狀:1、在執行delete刪除動作時,ie解析為get動作,將delete解析為參數。
                       2、在firefox中就沒有這種問題,能正常刪除。

       ===================================================

       網上他人的一種解決方案:http://www.iteye.com/topic/746456

       Rails 3所做的很大一個改進就是:Unobtrusive JavaScript(非侵入式的JavaScript),以實現對HTML和JavaScript代碼的分離。比如:
      
<%= link_to "Destroy", @product, :confirm => "Are you sure?", :method => :delete %>  


     將轉換成Html代碼 
 

     <a href="/products/8" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a>  

       
    不再有多餘的js代碼,不過那個data-是html5的元素,因此這段代碼要跑起來還是有點困難的。在windows上,點擊destroy會跳到show的action中去。引用:
         引用  The reason that the link isn’t working is that we don’t have the
    relevant JavaScript files referenced in the head section of the page so
    the link will behave as a standard link and perform a GET request as
    there’s nothing telling it to do otherwise.

     

        也就是說瀏覽器把它當做get方法處理了。在linux
    ubuntu下,雖然執行了delete操作,但是沒有authenticity_token元素,會被認為是CSRF攻擊,因此會拋出
    InvalidAuthenticityToken異常。這個問題讓我想起過加skip_before_filter
    :verify_authenticity_token,但是這明顯不是好的方式,也試著改一下
    request.forgery_whitelisted?方法,雖然也能解決問題,但更加的不好。無意間在網上看見了一種處理方式,這種方式應該是標準
    的解決方案了吧。

        解決方式很簡單,在layouts目錄下的模板檔案的頭部加上:

      <%= javascript_include_tag :defaults %>  <%= csrf_meta_tag %>

         一般第一句是有的,只是缺少第二句。看看csrf_meta_tag源碼:

      def csrf_meta_tag     if protect_against_forgery?       %(<meta name="csrf-param" content="#{Rack::Utils.escape_html(request_forgery_protection_token)}"/>\n<meta name="csrf-token" content="#{Rack::Utils.escape_html(form_authenticity_token)}"/>).html_safe      endend

      相應的html代碼與下面類似:

      <meta name="csrf-param" content="authenticity_token"/><meta name="csrf-token" content="WO8dau2vScU/ad3JKLh2jRdSm7N8QEdNfX3ggGawxOE="/>

      這段代碼主要解決的就是csrf的問題。在原來的rails2中,通過js建立一大段代碼來提交刪除操作,提交方式為post,其中就有這個隱藏欄位,所以原因是可能沒有這個不能識別到delete操作吧。

      雖然這個問題就這樣解決了,但有些困惑的是,在windows下與linux居然表現出不同的行為,用的firefox都是3.6.8的,rails3rc版本也是一樣的,只有ruby一個是187,一個是192,難道對ruby解析器有關?

      後記(2010.9.2),最近突然相起,分頁的時候刪除操作也應該進行相應的處理,如在第三頁刪除某條記錄,那麼刪除之後也應該回到第3頁。這個問題分頁外掛程式並沒有進行相應的處理,因此只能自己做。

      在rails3中,本人使用的是:

             gem "will_paginate", "3.0.pre2"

      這個外掛程式非常使用簡單,功能強大,比我見過的所有java分頁外掛程式都好。怎麼使用可參照官網,很簡單的。下面講一下怎麼處理刪除之後又回到原來的那一頁。

      仔細觀察了一下,分頁就是通過page參數實現的,只要在刪除時將page參數傳過去,應該就可以解決問題。於是刪除時加上page參數:

      <%= link_to 'Destroy', user_path(user,:page=>params[:page]),:confirm => 'Are you sure?', :method => :delete %>

      這樣刪除連結就會加上page=..多少的參數了。但是這樣還沒完,因為刪除之後會進行查詢操作。上面的操作只是把page參數傳進destroy方法了,但是並沒有傳送到index方法去。

      由於本人對rails的瞭解還比較淺,因此簡單一點,再傳一次。

      respond_with(@user) do |format|      format.html { redirect_to(:action=>"index",:page=>params[:page]) }    end

      試一下,respond_with不知道該怎麼傳參數過去,文檔上也沒說,網上也沒找到這麼用的,因此只能用redirect_to了。

      經過上面兩步以後,刪除回到原來的分頁位置就可以解決了。

      聯繫我們

      該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

      如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

      A Free Trial That Lets You Build Big!

      Start building with 50+ products and up to 12 months usage for Elastic Compute Service

      • Sales Support

        1 on 1 presale consultation

      • After-Sales Support

        24/7 Technical Support 6 Free Tickets per Quarter Faster Response

      • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.