Как сделать Ajax-вызовы с Rails 3, используя remote_function? - PullRequest
15 голосов
/ 26 июля 2010

Я пытаюсь сделать вызов onchange в поле выбора. Для своего приложения я использую jquery.js и rails.js, как уже упоминалось, для использования UJS.Но все же генерируемый код предназначен для Prototype, а не для вызовов jquery ajax.Мой код выглядит следующим образом:

<%= select_tag :category, 
       options_for_select(
           Category.find(:all,:select=>"name,id").collect{|c| [c.name,c.id]}),
       :onchange => remote_function(:url => {:controller => "posts", 
                                             :action => "filter_post",
                                             :filter =>"category"}, 
                                    :with=>"'category_id=' + $('#category').val()") %>

Код, сгенерированный этим:

new Ajax.Request('/posts/filter_posts?filter=category', {asynchronous:true, evalScripts:true,
parameters:'category_id=' + $('#category').val() + '&authenticity_token=' +
encodeURIComponent('CCyYj1wqXtddK6pUV6bAxw0CqZ4lbBxDGQHp13Y/jMY=')})

Ответы [ 5 ]

25 голосов
/ 10 февраля 2011

Как сказал Сергей: в рельсах нет функции remote_function 3.

Решение состоит в том, чтобы незаметно добавить обработчик onchange, используя что-то вроде:

$(function($) {
    $("#selector_for_element").change(function() {
        $.ajax({url: '<%= url_for :action => 'action_name', :id => @model.id %>',
        data: 'selected=' + this.value,
        dataType: 'script'})
    });
});

Это вызовет метод action_name в текущем контроллере, передавая результат selected=... в качестве параметра. Теперь вы можете вернуть кусок JavaScript, например, используя что-то вроде:

calculated = calculate_some_value_using(params[:selected])
render(:update) {|page|
  page << "$('#selector_for_field_to_update).html(#{calculated})"
}

в контроллере. Строка, которую вы добавляете к странице, должна быть действительным javascript и будет выполнена автоматически, если вы используете $ .ajax.

РЕДАКТИРОВАТЬ: К вашему сведению, недавно мы добавили помощник по изменению выбора в jquery-ujs, поэтому вы можете сделать это незаметным способом, используя встроенный адаптер jquery-ujs:

<%= select_tag :category_id, 
   options_for_select(
       Category.find(:all,:select=>"name,id").collect{|c| [c.name,c.id]}),
   :data => { :remote => true, :url => url_for(:controller => "posts", 
                                         :action => "filter_post",
                                         :filter =>"category") } %>

Хотя, честно говоря, добавление события select change на самом деле никогда не будет «ненавязчивым», поскольку для пользователей с отключенным javascript не будет изящного отката, если ваша форма не зависит от результата запроса AJAX.

10 голосов
/ 09 декабря 2010

В rails нет функции remote_function 3. Если вы используете jQuery, вы можете сделать что-то вроде этого:

$.ajax({
    type: 'POST',
    url: 'http://your_url/blah',
    data: 'param1=value1&params2=value2',
    success: function(data){eval(data);}
});
3 голосов
/ 13 января 2011

Ниже приведен простой фрагмент jQuery из моего хамла

:javascript

    $("#select_box_id").change(function() {
      $.post('#{target_url}?param_one='+$(this).val());
    });

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

1 голос
/ 06 февраля 2013

Если вы столкнулись с проблемой обновления большого приложения rails до rails 3, в котором интенсивно использовалась функция remote_function, вы можете добиться ограниченной обратной совместимости, добавив метод application_helper, который генерирует код jQuery в формате, предложенном другими ответами здесь,Я смог использовать этот код как есть, хотя мне пришлось обновить один фрагмент вызывающего кода, чтобы использовать параметр сценария new: success вместо параметра: update hash, который здесь не поддерживается.Это может занять некоторое время, чтобы со временем выполнить рефакторинг всех вызовов функции remote_function для использования ненавязчивых обратных вызовов событий jquery-ujs:

def remote_function(options)
    ("$.ajax({url: '#{ url_for(options[:url]) }', type: '#{ options[:method] || 'GET' }', " +
    "data: #{ options[:with] ? options[:with] + '&amp;' : '' } + " +
    "'authenticity_token=' + encodeURIComponent('#{ form_authenticity_token }')" +
    (options[:data_type] ? ", dataType: '" + options[:data_type] + "'" : "") +
    (options[:success] ? ", success: function(response) {" + options[:success] + "}" : "") +
    (options[:before] ? ", beforeSend: function(data) {" + options[:before] + "}" : "") + "});").html_safe
end
0 голосов
/ 13 августа 2012

Ajax Вызов действия контроллера с параметрами:

function combined_search() {
    var countries = $('#countries').val();
    var albums = $('#albums').val();
    var artists = $('#artists').val();
    $.ajax({
        url:"<%=url_for :controller => 'music_on_demand',:action => 'combined_search' %>",
        data:'country=' + encodeURIComponent(countries) + '&albums=' + encodeURIComponent(albums) + '&artists=' + encodeURIComponent(artists),
        cache:false,
        success:function (data) {
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...