Rails 3: Как отправить код Javascript из контроллера? - PullRequest
7 голосов
/ 29 марта 2011

Когда foo метод MyController вызывается через Ajax, он может возвращать код Javascript следующим образом:

class MyController < ApplicationController
  def foo
    render :js => "alert('Hello');"
  end
end

Возможно ли сделать что-то подобное для возврата кода Javascript, когда fooназывается нормально (не через Ajax)?Я хотел бы сделать что-то вроде этого:

class Job < ApplicationController
  def edit
    if user_type == 'demo'
      [Here I would like to display a Javascript alert saying that 
       the job cannot be edited in demo mode. How would you do this?]
    else
      @job = Job.find(params[:id])
    end
  end
end

Ответы [ 3 ]

5 голосов
/ 29 марта 2011

короткий ответ: вы не можете.

Когда вы отображаете для: js, вызывающий код представляет собой инфраструктуру javascript, которая знает, что она запросила js, и выполнит возвращенный код, чтобы он вступил в силу, когда асинхронный вызов выполняет свое действие onSuccess.

При рендеринге по умолчанию вызывающим кодом является браузер, который ожидает, что html не будет выполнять чистый js.

То, что вы можете сделать, это заставить ваш вид возвращать html с некоторым javascript в начале с обработчиком window.onload (), определенным для отображения предупреждения.Но вам все равно придется возвращать html (если вы не хотите отображать данные, сделайте его перенаправленным на предыдущий шаблон представления с определенным аргументом, чтобы у представления был обработчик события) (/1138499/kak-vypolnit-funktsiy-kogda-stranitsa-polnosty-zagruzhena)

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

3 голосов
/ 29 марта 2011

Я рекомендую вам поддерживать ваш контроллер в чистоте и поместить любой код JavaScript в шаблон rjs:

Контроллер

class MyController < ApplicationController
   def edit
      render do |page|
        page.html {}
        page.js {}
      end
   end
 end

edit.js.erb

alert("hello");

Всякий раз, когда вызывается /my/edit/1.js (через: edit_my_path(1, :format => :js)), файл edit.js.erb отображается с предупреждением.

Всякий раз, когда вызывается /my/edit/1.js (через: edit_my_path(1)), файл edit.html.erb будет отображаться с отображением обычного HTML.

Если вам нужно проверить, является ли запрос ajax (и, следовательно, не просто обычным вызовом .js), вы можете в вашем контроллере сделать: request.xhr?

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

0 голосов
/ 15 апреля 2016

Вы можете просто визуализировать javascript как текст, когда запрашивается формат js

class MyController < ApplicationController
   def update
      respond_to do |format|
        format.html {}
        format.js { render text: 'alert();' }
      end
   end
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...