Rails: отправка (через AJAX) при нажатии раскрывающейся опции - PullRequest
12 голосов
/ 25 февраля 2009

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

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

Не стесняйтесь указывать на любые тангенциальные предложения или что-то еще ... Я относительно новичок в 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 %>

Ответы [ 5 ]

15 голосов
/ 26 февраля 2009

Есть несколько способов справиться с этим. Конечно, подход поля наблюдения один, но вы также можете использовать простой 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")}"})

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

4 голосов
/ 03 июня 2011

In 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 голосов
/ 25 февраля 2009

Три шага!

  1. Сделай свой form_for а remote_form_for; добавить идентификатор!
  2. Добавьте observe_field после вашего select
  3. Настройте observe_field для отправки формы

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

<%= observe_field "id_of_select", :function => "$('form_id').submit();" %>
3 голосов
/ 28 февраля 2009

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

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

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

1 голос
/ 24 января 2017

Я использую Rails 5, и я также столкнулся с подобной ситуацией, но в моем случае ответ @scott не отправлял форму с использованием AJAX, как ожидалось, хотя я добавил опцию remote: true в форму нет кнопки 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 %>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...