通过Ajax调用fooMyController方法时,它可能会返回如下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进行检查,并且可能只是重定向到上一页。

10-05 22:53
查看更多