функция rails, вызываемая из jquery

#jquery #ruby-on-rails-3

#jquery #ruby-on-rails-3

Вопрос:

ищу способ реализовать вызов метода rails из jquery, но без рендеринга чего-либо, просто в фоновом режиме.

Идея заключается в том, что у меня есть тег select с включенным множественным выбором, в моей модели есть логическое поле с именем active, и когда элемент выбран, для active будет установлено значение true, в противном случае false.

в моем application.js у меня есть это:

 $(".multiselect").change(function() {
    $("option", this).each(function() {
        if(this.selected) {
             // do true for checked
        } else {
             // do false for unchecked
        }
    }
});
  

эта функция работает нормально, но я застрял на двух частях, я знаю, что могу получить идентификатор объекта из (this).val(), но куда мне поместить функцию, которая найдет его и изменит активное поле? В контроллере или в модели? Имейте в виду, мне не нужно ничего отображать, просто делайте что-то в фоновом режиме.

И, во-вторых, как мне вызвать эту функцию из моего jquery?

Любая помощь приветствуется!

Ответ №1:

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

Вы могли бы сделать что-то вроде этого

в вашем application.js

 $(".multiselect").change(function() {
  $("option", this).each(function() {
    if(this.selected) {
         // do true for checked
    } else {
         // do false for unchecked
    }
  }
  //submitting form after doing stuff
  $.post($(this).parent("form") .... );
});
  

В вашем контроллере вы, вероятно, сопоставили бы ее с методом ‘update’

 def update
  # logic to update active attribute of model
  render :nothing => true
end
  

Комментарии:

1. большое спасибо. Это не внутри формы (по крайней мере, на данный момент). Итак, если у меня есть метод обновления, должен ли я указать что-то вроде: def update @foo = Foo.find(параметры [:id]) @foo.active = true / false end? но как бы я вызвал эту функцию из js без использования form? могу ли я сказать $.post({#update}(this.val())? или что-то подобное для передачи идентификатора?

2. Вы могли бы сделать это с помощью запроса GET, но есть ли конкретная причина, по которой вы не хотите переносить список выбора в форму? Хорошим соглашением является всегда выполнять запрос POST при изменении ресурса.

3. Также, я забыл добавить, чтобы сделать это без отправки формы, вам пришлось бы выполнить jQuery.get() Что-то вроде этого — $.get(«/some_URL», {foo_active: $ (this).val()}, null, «script»);