Rails 3:如何从Controller发送Javascript代码?

Mis*_*hko 7 javascript ruby-on-rails ruby-on-rails-3

当通过Ajax调用foo方法时MyController,它可能返回如下的Javascript代码:

class MyController < ApplicationController
  def foo
    render :js => "alert('Hello');"
  end
end
Run Code Online (Sandbox Code Playgroud)

是否有可能做类似的事情在foo正常调用时返回Javascript代码(不是通过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
Run Code Online (Sandbox Code Playgroud)

Jea*_*ean 5

简短的回答是:你做不到.

当你渲染:js时,调用代码是一个javascript框架,它知道它请求了js并将执行返回的代码,使它在异步调用执行onSuccess操作时生效.

当渲染为默认值时,调用代码是期望html不会执行纯js的浏览器.

你可以做的是让你的视图在开头用一些javascript返回html,并定义一个window.onload()处理程序,使其显示警告.但是你仍然需要返回html(如果你不想显示数据,让它重定向到带有特定参数的前一个视图模板,这样视图就会有事件处理程序)(https://stackoverflow.com/ questions/1033398/execute-javascript-when-page-has-fully-loaded)

您还可以更改调用编辑操作的事件处理程序,以便在执行操作之前显示警报.为了防止用户禁用js并越过警报,你需要仍然检查user_type,并且可能只是重定向到上一页.