2011-03-15 87 views
11

我最近就遇到了這個問題:Rails 3 link_to (:method => :delete) not workingRails 3 link_to generator for:post,:put,&:delete?

在這我很困惑,爲什麼我link_to 'test', test_path(:test => test), :method => :post不工作(爲什麼它被越來越而非張貼)。正如上面的帖子所示,這是因爲我沒有Rails的javascript文件,它可以動態地處理表格,爲:post,:put & :delete

我不確定我特別喜歡依賴於javascript來爲我做這件事,因爲我希望我的應用程序能夠在禁用javascript的情況下完全正常運行;這是我喜歡開發的方式(所以我知道我的所有Rails編程功能都能正常工作),並且當我用javascript連接應用程序時,我不必擔心重複此功能,因爲我通常會擦除由Rails生成的股票JavaScript文件。

我從某個地方讀到,在技術上,超鏈接(錨點元素)應該只用於GET請求,並且該按鈕(作爲表單元素的一部分)應該用於其他方法。

所以,我的兩個問題:

  1. 是否有寶石在那裏,將改寫在我看來,任何link_to ... :method =>到一個表單元素,當我的觀點被渲染上最靠譜?
  2. 如果不是,我將如何鉤入視圖解析器來寫我自己的? (使用HAML,preferrably)

從本質上講,我想的是寫這在我的HAML文件:

= link_to 'Test Link', some_path(:with => some_resource), :method => :post 

...並有我的渲染HTML輸出拿出這樣的:

<form action="some_path?with=some_resource" method="post"> 
    <!-- insert appropriate _method hidden field here --> 
    <!-- add appropriate csrf token and whatnot --> 
    <button type="submit">Test Link</button> 
</form> 

......讓所有的link_to傭工定義的方法(因此,不會影響普通的鏈接,其動詞GET)將工作無javascript


我也很感激這個問題的爲什麼部分的任何想法,具體爲什麼Rails的團隊決定保留這個功能依賴於JavaScript的,而不是通過純HTML這樣做呢?

回答

22

看來,你真的想要一個單一的元素形式(在這種情況下,一個按鈕)。如果是這樣,你想要的button_to幫手:

button_to 'Test Link', some_path(:with => some_resource), :method => :post

這將產生與它內部的input[type=submit]元素的形式。

如果沒有Javascript,則不能使用除GET之外的HTTP動詞提交的超鏈接。

如果需要通過button_to所呈現的形式更多的風格/控制,你可以做這樣的事情:

module LinksHelper 
    def link_form(text, destination, options = {}) 
    form_tag(destination, :method => options.delete(:method)) do 
     <<-HTML 
     <!-- some HTML code here --> 
     <button type="submit">#{text}</button> 
     <!-- some more HTML code here --> 
     HTML 
    end 
    end 
end 
+0

大。這給了我一些工作。謝謝! – neezer 2011-03-17 02:16:52