Rails 3 генератор link_to для: post,: put, &: delete? - PullRequest
11 голосов
/ 15 марта 2011

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

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

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

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

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

  1. Есть ли там драгоценный камень, который переписывает любые link_to ... :method =>, на мой взгляд, в элемент формы на лету, когда мои представления отображаются?
  2. Если нет, то как мне подключиться к парсеру представления, чтобы написать свой собственный? (используя 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 Ответ

22 голосов
/ 17 марта 2011

Кажется, что вам действительно нужна форма с одним элементом (в данном случае кнопка).Если это так, вам нужен помощник 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
...