控制器

时间:2016-05-23 10:09:47

标签: 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, 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

1 个答案:

答案 0 :(得分:0)

使用“ head”代替“ rendering: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

这将为您提供所需的结果,并且升级时将减少一行更改。