Подтвердить что ты не робот

Rails: отправить (через AJAX) при нажатии раскрывающегося списка

Каков самый простой и изящный способ автоматической отправки формы AJAX при выборе раскрывающегося списка? Я создаю страницу администрирования, где администратор может изменять права пользователя (где "разрешения" хранятся как целое число), и я хотел бы, чтобы поле "permissions" было раскрывающимся полем, которое автоматически отправляет и обновляет, когда администратор нажимает на параметр, который он хочет, чтобы пользователь имел.

Вот урезанная версия того, что я сейчас смотрю. Мне нужно знать, как лучше всего преобразовать это в удаленную форму, которая автоматически отправляется при нажатии кнопки.

Не стесняйтесь указывать какие-либо тангенциальные предложения или что-то еще... Я относительно новичок в Rails и просто добираюсь до точки, где могу писать код, не постоянно ссылаясь на работу других.

<!-- This is the "index" view, by the way. -->
<% for membership in @story.memberships %>
  <% form_for membership do |f| %>
    <%= f.select :permissions, [['none', 0], ['admin', 9]] %>
  <% end %>
<% end %>
4b9b3361

Ответ 1

Есть несколько способов справиться с этим. Конечно, подход поля наблюдения является одним, но вы также можете использовать простой javascript или remote_function:

Вот простой подход JS:

<% remote_form_for membership do |f| %>
    <%= f.select :permissions, [['none', 0], ['admin', 9]], {}, :onchange => 'this.form.submit()' %>
<% end %>

Другим способом будет что-то вроде этого, и будет избегать создания формы (и это может иметь пару синтаксических ошибок):

<%= select_tag(:permissions, [['none', 0], ['admin', 9]], {:onchange => "#{remote_function(:url  => permissions_path(:story_id => story,
             :with => "'permission='+value")}"})

Лично я предпочитаю первое.

Ответ 2

Три шага!

  • Сделайте form_for a remote_form_for; добавьте идентификатор!
  • Добавьте observe_field после select
  • Настройте свой observe_field, чтобы отправить свою форму.

Последний бит выглядит примерно так:

<%= observe_field "id_of_select", :function => "$('form_id').submit();" %>

Ответ 3

В Rails 3:

<%= form_for(membership, :remote => true) do |f| %>`
  <%= f.select :permissions, [['none', 0], ['admin', 9]], {}, :onchange => 'this.form.submit();' %>
<% end %>

Обратите внимание, что он this.form.submit(); не отвечает. И не забудьте точку с запятой Javascript.

Ответ 4

Узнайте, как это сделать без Rails, используя рамки по вашему выбору. Использование тегов Rails для выполнения AJAX может быстро выполнить задачу, но может быть очень ограничено, когда вам нужно изменить конкретные вещи о том, как работает тег.

Читайте о веб-стандартах и ​​о том, как писать ненавязчивый javascript на этих сайтах: http://ajaxian.com/ http://www.alistapart.com/

Вы сможете создавать более гибкие, удивительные интерфейсы, изучая, как выполнять AJAX без Rails.

Ответ 5

Я использую Rails 5, и я тоже столкнулся с подобной ситуацией, но в моем случае ответ, заданный @scott, не отправил форму с помощью AJAX, как и ожидалось, хотя я добавил параметр remote: true в форму (I не имеют кнопки submit в форме).

Если кто-то сталкивается с аналогичной проблемой, попробуйте изменить JS-код, например:

<% form_for membership remote: true, id: '#member_form' do |f| %>
  <%= f.select :permissions, [['none', 0], ['admin', 9]], onchange: '$("#member_form").trigger("submit");' %>
<% end %>

Надеюсь, что это поможет.