Rails 3 link_to generator for:post,:put,& :删除?

时间:2011-03-15 17:20:40

标签: http ruby-on-rails-3 rest

我最近遇到了这个问题: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请求,并且那些按钮(作为表单元素的一部分)应该用于其他方法。

所以,我的两个问题:

  1. 当我的视图呈现时,是否有一个宝石会在我的视图中将任何link_to ... :method =>重写为表单元素?
  2. 如果没有,我如何挂钩到视图解析器来编写自己的? (使用HAML,最好)
  3. 基本上,我想要的是在我的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进行此操作?

1 个答案:

答案 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