Ruby on rails 控制器中的JS格式

Ruby on rails 控制器中的JS格式,ruby-on-rails,Ruby On Rails,假设我有一个控制器动作,每当你试图通过js格式访问它时,我不想渲染任何东西 def no_js_please # there isn't a no_js_please partial or view respond_to do |format| format.html { # render a template } format.json { render json: {valid: true} } format.js { render nothing: true

假设我有一个控制器动作,每当你试图通过js格式访问它时,我不想渲染任何东西

def no_js_please
  # there isn't a no_js_please partial or view
  respond_to do |format|
    format.html { # render a template }
    format.json { render json: {valid: true} }
    format.js { render nothing: true, status: :not_found }
  end
end
当您通过html或JSON访问端点时,它可以正常工作。当您试图通过JS访问它时,它不起作用。但是,它确实执行了这个块,因为如果我在js块中添加一个
binding.pry
,它就会被拾取

但是,这确实有效:

def no_js_please
  if request.format.js?
    render nothing: true, status: :not_found
  end
end
那么这两者之间有什么区别呢

编辑

正如下面提到的人类,实际的错误是什么?因此,在这种特殊情况下,它会引发一个
ActionController::InvalidCrossOriginRequest

使用“head”而不是“render nothing:true”。不管怎样,Rails 5+实际上不推荐使用后者

def no_js_please
  respond_to do |format|
    format.html { # render a template }
    format.json { render json: {valid: true} }
    format.js { head :not_found }
  end
end

这将使您获得所需的结果,并且在升级时可以少更改一行。

您可以定义“当您试图通过JS访问它时,它不起作用”吗?它是否会在Rails或浏览器中引发错误(即服务器发回一些无效的JS响应)?Render不会阻止块的执行,它只是将信息传递给视图并在控制器中继续。在你的no_-js_-please方法中,它正在做同样的事情,但是它正在到达终点线并返回那里。您应该在渲染js之后添加一个“return false”来停止控制器的执行。@bkunzi01没有可向其传递信息的视图。我以前尝试过在块内显式返回,但没有成功。您使用的是哪个版本的Rails?有任何after筛选器吗?