Rails 3 link_to генератор для: post,: put, &: delete?

Недавно я столкнулся с этой проблемой: Rails 3 link_to (: method = > : delete) не работает

В котором я был смущен, почему мой link_to 'test', test_path(:test => test), :method => :post не работал (почему это был GETting, а не POSTing). Как видно из вышеприведенного сообщения, это произошло потому, что у меня не было файлов javascript Rails, которые динамически обрабатывают форму "на лету" для :post, :put и :delete.

Я не уверен, что мне особенно нравится полагаться на javascript, чтобы сделать это для меня, так как я хочу, чтобы мое приложение полностью функционировало с отключенным javascript; как мне нравится развиваться (поэтому я знаю, что у меня все функциональные возможности Rails работает правильно), и когда я подключаю свое приложение к javascript, мне не нужно беспокоиться о дублировании этой функции, так как я обычно вытираю файл javascripts запаса, созданный Rails.

Я где-то читал, что технически гиперссылки (элементы привязки) должны использоваться только для запросов GET и что для других методов следует использовать кнопки (как часть элементов формы).

Итак, мои два вопроса:

  • Есть ли там драгоценный камень, который будет переписывать любые link_to ... :method => на мой взгляд на элемент формы "на лету", когда мои представления отображаются?
  • Если нет, как бы я зацепил парсер представления, чтобы написать свой собственный? (используя HAML, предпочтительнее)

По сути, я бы хотел написать это в моем файле 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

Кажется, что вам действительно нужна единая форма элемента (в данном случае кнопка). Если это так, вам нужен помощник button_to:

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

Это приведет к созданию формы с элементом input[type=submit] внутри нее.

Без Javascript у вас не может быть гиперссылки, которая будет отправляться с использованием HTTP-глагола, отличного от "GET".

Если вам нужно больше стиля/управления формой, отображаемой 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