2011-03-15 77 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