我最近遇到了这个问题:Rails 3 link_to (:method => :delete) not working
我很困惑为什么我的link_to 'test', test_path(:test => test), :method => :post
没有工作(为什么它是GETting而不是POSTing)。如上面的帖子所示,这是因为我没有Rails javascript文件,它可以动态地为:post
,:put
& :delete
。
我不确定我是否特别喜欢依赖javascript为我这样做,因为我希望我的应用程序能够在禁用javascript的情况下完全正常运行;这就是我喜欢开发的方式(所以我知道我的所有Rails编程功能都能正常工作),当我用javascript连接我的应用程序时,我不必担心重复这个功能,因为我通常会擦除由Rails生成的股票javascripts文件。
我从某处读过,从技术上讲,超链接(锚元素)应该只用于GET请求,并且那些按钮(作为表单元素的一部分)应该用于其他方法。
所以,我的两个问题:
link_to ... :method =>
重写为表单元素? 基本上,我想要的是在我的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进行此操作?
答案 0 :(得分: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