posts - 262,  comments - 221,  trackbacks - 0
          link_to是Rails中提供的一個內(nèi)置方法,用于產(chǎn)生一個超鏈接,常用的方法通常是link_to "鏈接文字", options = {}, html_options = {}, 如果我們不指定提交的方法,默認情況下將產(chǎn)生一個HTTP GET請求,但是我們也可以通過指定提交方法來避免某些敏感數(shù)據(jù)的泄漏。

          在《Agile web development with Rails》一書中,有這樣一個練習(xí)題:為購物網(wǎng)站上面的圖片添加一個超鏈接,當(dāng)點擊該圖片時請求名為store的controller下add_to_cart action,同時要求使用POST方式來請求。代碼如下所示:

          <%= link_to image_tag(product.image_url),  options = {:action => "add_to_cart"},  html_options={:method => "post"%> 

          其中第一個參數(shù)image_tag是一個內(nèi)置方法,用于產(chǎn)生一個<img src="xxx" />的HTML標(biāo)簽,而options接受一個hash容器,在這個容器中只有一個參數(shù)action,它告訴了請求對應(yīng)的action,于是rails會在構(gòu)建<a>表情的href屬性時將其轉(zhuǎn)換為:http:localhost:3000/store/add_to_cart 這種形式:即請求StoreController下的add_to_cart方法。最重要的一定是html_options參數(shù),它也接受一個hash容器,通過method="post"來告訴瀏覽器,采用post方式來提交請求。

          但是我們知道post通常是在form中才用到的,這里并沒有form的定義,那么是如何采用post方式來進行提交的呢?通過閱讀瀏覽器解析后的源代碼,我們可以發(fā)現(xiàn)rails在編譯期間做了很巧妙的處理:它創(chuàng)建了一個動態(tài)的、隱藏的表單來提交:

          <href="/store/add_to_cart" onclick="..."><img alt="Auto" src="/images/auto.jpg?1265130093" /></a> 

          下面就是onClick的內(nèi)容:

          {
            
          //創(chuàng)建一個隱式的表單對象,并設(shè)置提交方式為POST,已經(jīng)設(shè)置提交的URL
            var f = document.createElement('form');  
            f.style.display 
          = 'none'; 
            
          this.parentNode.appendChild(f); 
            f.method = 'POST';
           
            f.action = this.href;


            
          //為表單添加一個隱藏域,指定提交的方式參數(shù)
            var m = document.createElement('input'); 
            m.setAttribute('type', 'hidden'); 
            m.setAttribute('name', '_method'); 
            m.setAttribute('value', 'post');
            f.appendChild(m);
            
            
          //為表單添加一個隱藏域,指定當(dāng)前的Session token key,防止重復(fù)提交
            var s = document.createElement('input'); 
            s.setAttribute('type', 'hidden'); 
            s.setAttribute('name', 'authenticity_token'); 
            s.setAttribute('value', '6c02dccc61c8e299bf1765bd0414355e9d8a4815'); 
            f.appendChild(s);
            
            
          //動態(tài)提交表單
            f.submit();
            
            
          return false;"
          }

          這就是采用post方式提交請求的“秘密”,rails的實現(xiàn)相當(dāng)優(yōu)雅!可是如果我們把上面的link_to代碼稍微改一下,如下面所示,會有什么結(jié)果呢?

          <%= link_to image_tag(product.image_url),  {:action => "add_to_cart", :method => "post"%> 

          我們來看看最終產(chǎn)生的頁面源代碼

          <href="/store/add_to_cart?method=post"><img alt="Auto" src="/images/auto.jpg?1265130093" /></a>

          很明顯,method=post變成了URL的請求參數(shù),而不是HTTP 請求報頭了。也就是說這里產(chǎn)生的是一個HTTP GET請求:http://localhost:3000/store/add_to_cart?method=post,而正確的請求應(yīng)該是:http://localhost:3000/store/add_to_cart

          所以我們一定要記住:options={}是用來傳遞請求參數(shù)的,而html_options={}是用來設(shè)置請求報頭的,不能搞混!


          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2010-05-17 16:41 Paul Lin 閱讀(6507) 評論(4)  編輯  收藏 所屬分類: RoR


          FeedBack:
          # re: Rails中的link_to方法注意點[未登錄]
          2011-04-18 16:40 | test
          測試哈  回復(fù)  更多評論
            
          # re: Rails中的link_to方法注意點[未登錄]
          2011-04-18 16:41 | test
          test  回復(fù)  更多評論
            
          # re: Rails中的link_to方法注意點[未登錄]
          2011-04-18 16:42 | test
          ajax comment  回復(fù)  更多評論
            
          # re: Rails中的link_to方法注意點[未登錄]
          2013-08-30 15:41 | 陌生人
          我以為你要講什么呢? 就是不要搞混呀   回復(fù)  更多評論
            
          <2013年8月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 岢岚县| 永胜县| 屏山县| 塘沽区| 安徽省| 沁水县| 宝应县| 海门市| 金平| 嵊州市| 汽车| 白山市| 鹤峰县| 南昌县| 安宁市| 原阳县| 北京市| 如东县| 苏尼特左旗| 吕梁市| 建德市| 沿河| 合作市| 田东县| 铜陵市| 抚宁县| 清新县| 孟津县| 漠河县| 武清区| 齐河县| 抚宁县| 肥西县| 时尚| 宁都县| 那坡县| 思茅市| 永善县| 湘乡市| 仙游县| 偃师市|