Rails 3: ссылки, которые вызывают действия, но не покидают / не обновляют текущую страницу? - PullRequest
5 голосов
/ 30 октября 2011

Есть ли в Rails 3 способ вызвать действие (поэкспериментировать с базой данных) без обновления или запуска действия, а затем перенаправить на текущую страницу?

Я пытался связываться с :remote => true в link_to, но у меня это не работает.Или, может быть, я неправильно понял его назначение ... или я неправильно его использую.

Ответы [ 2 ]

6 голосов
/ 30 октября 2011

Существует 2 сценария, которые обычно используются при вызове действия из представления в Rails3:

  1. Использование обычного link_to с его вариациями.
  2. Использование link_to снеобязательный аргумент :remote => true (по умолчанию false)

first one приводит к нормальному циклу запроса / ответа:

  1. Вызовите действие в контроллере.
  2. Если ничего особенного не сделано (render или redirect), просто визуализируйте представление, связанное с действием.Поэтому, если действие называется do_db_stuff, Rails3 пытается отобразить do_db_stuff.html.erg (или do_db_stuff.html.haml`) в каталоге соответствующих представлений.
  3. Вы можете изменить это, вызвав явно render или redirect в конце вашего действия:
    • render: отображение шаблона, который вы называете, с использованием текущего состояния контроллера.
    • redirect: перенаправление на новое действие (изэтот или другой контроллер), и затем использовать соответствующий шаблон для рендеринга.

Это, например, используется при вызове в действии create некоторого метода сохранения, который завершается ошибкой, затемвы возвращаетесь на ту же страницу, вызывая render :action => "new" # doen't execute the method

second , который просто вызывает действие и возвращает результат на страницу.На этой странице лежит ответственность за то, что с этим делать.В немного другом сценарии, например, в моем приложении есть что-то вроде этого:

  1. С левой стороны представления есть список задач.
  2. КаждомуЭлемент задачи, на контроллере зарегистрирован обработчик нажатия, который вызывает search_task (используя JavaScript с AJAX).
  3. Контроллер отвечает на этот вызов, отправляя результат обратного вызова render :partial ....
  4. Функция JavaScript в обработчике зарегистрировала функцию успеха, которая выглядит следующим образом:

    element.bind('click', function() {
        $('#left').children().removeClass('selected')
        element.addClass('selected');
        $.ajax({url: '/tasks/search_task/' + task_id, 
            async: false,
            dataType: 'html',
            success: function(data) {
                target.html(data);
            }});
    }
    

    (здесь добавлена ​​вся функция щелчка)

  5. Таким образом, в результате (при успешной отправке) содержимое target будет заменено отправленным HTML-кодом.

Я не знаю, возможно ли что-то подобное сlink_to, возможно, есть опция.

Так что да, :remote => true должно работать для вас, если вы хотите игнорировать только результат.

2 голосов
/ 30 октября 2011

Я использую запрос AJAX для этого:

<%= link_to "stock", { :controller => 'ReadItLater', :action => "stock", 
                     :qid => q.question_id } , :remote => true, :class=>'ddm' %>

Вот код контроллера:

    def stock
      @user = UserData.find_by_login(session[:cuser])
      @user.stock(params)

      respond_to do |format|
          format.js { render :layout=>false }
      end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...