Rails ajax фоновые запросы - PullRequest
       6

Rails ajax фоновые запросы

0 голосов
/ 15 января 2010

У меня есть remote_form, который работает на 100%

Когда пользователь нажимает кнопку «Отправить», он выходит, извлекает данные из БД или данные, скопированные с другого сайта, и без проблем обновляет страницу ...

Проблема, с которой я столкнулся сейчас, заключается в том, что я хотел бы сделать то же самое, но сделать это без того, чтобы пользователь нажимал кнопку отправки с событием onload.Я думаю, что поступаю неправильно:

Технически это работает ... он действительно получает правильные данные, но вместо того, чтобы делать именно то, что делает remote_form_tag, он возвращает необработанные данные.Нет RJS replace_html.

Есть ли способ вообще пропустить form_for и просто выполнить действие контроллера непосредственно при загрузке страницы?

<script type="text/javascript">
    $(window).load(function() {
        // executes when HTML-Document is loaded and DOM is ready
        // jQuery.facebox('Big loading! <img alt=\"Loading\" src=\"/images/loaders/loading.gif\" />');
        //$("#update_form").submit();
        $("#update_form").submit(function () { return false; });

    });
</script>

Форма для

#html.erb
<%  form_remote_tag :url => { :action => "update_availables", :id => params[:id] },
    :loading => "jQuery.facebox('Big loading! <img alt=\"Loading\" src=\"/images/loaders/loading.gif\" />');",
    :html => { :method => "get" },
    :method => "get",
    :html => { :id => 'update_form' } do %>

Контроллер

  def update_availables
    @do_it = Available.get_new_availables :id => params[:id], :date => user_cart.getDate.to_s
    get_availables

    respond_to do |format|
      format.html
      format.js
    end
  end

RJS

page.replace_html :rooms, :partial => "available"
page << "jQuery.facebox.close();"

Ответы [ 2 ]

4 голосов
/ 15 января 2010

Ну, чтобы получить ту же функциональность, что и пользователь, щелкающий форму, вы можете использовать метод javascript click:

$(window).load(function() {

    $("#update_form input[type='submit']").click();

});

Но если вы отправляете без какого-либо ввода от пользователя, зачем вообще помещать данные в форму, почему бы просто не поместить вызов ajax в обработчик загрузки, который вызывает действие и обновляет код напрямую?

$(window).load(function() {

    $.ajax({
      type: "GET",
      url: "scraper_url",
      data: {field1:val,field2:val},
      success: function(responseText){
        // update page
      }
    });

});
1 голос
/ 15 января 2010

Я согласен с Флойдом здесь. Обычно я обращаюсь к этому типу вещей, возвращая необходимые данные JSON из действий Rails, а не используя RJS для обновления страницы. Это дает преимущества, которые JSON обычно генерирует очень быстро, и его можно легко перенести в модель как метод to_json и повторно использовать во многих различных контекстах.

Если обновление страницы простое, нет причины, по которой вы не можете сделать это встроенным, как это, но если это более сложно, вы можете определить это как функцию в статическом файле JavaScript. Хорошая особенность этого подхода заключается в том, что он делает ваш javascript и ruby-код более модульным и отделенным. Проще отладить и выполнить модульное тестирование, потому что код javascript стоит сам по себе, а не «утечку» (скорее как обфусцированную) с помощью ограниченных методов RJS. Вы также получаете некоторые преимущества в производительности от статического кэширования файлов JavaScript.

Если вы посмотрите по сети, то заметите, что в последнее время в блогах Rails не так много упоминаний о RJS. Это потому, что RJS была горячей идеей еще в 2006 году, но она вышла из употребления по мере развития лучших практик javascript. Чтобы понять это, вам нужно взглянуть на историю AJAX. Rails был одним из первых фреймворков, в который была встроена поддержка AJAX в 2005 году, и он сделал это с использованием Prototype, который был действительно первой современной фреймворк Javascript, но все еще был довольно грубым по краям. В то время очень большое количество веб-разработчиков искали способ избежать Javascript, который имел незаслуженно ужасную репутацию из-за несовместимости DOM. Поэтому люди были немного переусердствовали, чтобы написать обо всем с помощниками Rails. Это было здорово, когда люди были поражены очень простым AJAX, но по мере того, как зрелые фреймворки Javascript и люди стали более амбициозными с их функциональностью Javascript, стало ясно, что Javascript заслуживает того, чтобы быть гражданином первого класса. В настоящее время jQuery делает общие задачи javascript настолько лаконичными и элегантными, что ранние помощники Rails кажутся неуклюжими, даже когда их функциональность по умолчанию работает. Вероятно, есть еще несколько хороших вариантов использования RJS, но я не использовал его годами и совсем не пропустил.

Мой совет - принять Javascript. Возьмите Javascript: The Good Parts Дугласа Крокфорда, а затем проведите много времени с jQuery. Вы будете хорошо вознаграждены.

...