通过Ajax调用foo
的MyController
方法时,它可能会返回如下Java语言代码:
class MyController < ApplicationController
def foo
render :js => "alert('Hello');"
end
end
在正常调用
foo
时(不是通过Ajax),是否可以执行类似于返回Java代码的操作?我会做这样的事情: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
最佳答案
简短的答案是:您不能。
当渲染:js时,调用代码是一个javascript框架,它知道它请求了js,并且将执行返回的代码,以使该代码在异步调用执行onSuccess操作时生效。
当呈现默认值时,调用代码是浏览器,该浏览器期望html不会执行纯js。
您可以做的是使您的 View 以javascript开头的形式返回html,并定义一个window.onload()处理函数以使其显示警报。但是您仍然必须返回html(如果您不想显示数据,请使用特定参数将其重定向到先前的 View 模板,以便该 View 具有事件处理程序)
(https://stackoverflow.com/questions/1033398/execute-javascript-when-page-has-fully-loaded)
您还可以更改事件处理程序,该事件处理程序甚至在执行操作之前就调用edit操作以显示警报。为了防止用户禁用js并克服警报,您仍然需要对user_type进行检查,并且可能只是重定向到上一页。