【问题标题】:How can you return a head from a controller action without rendering its default view?如何在不渲染默认视图的情况下从控制器操作返回头部?
【发布时间】:2017-03-23 11:30:41
【问题描述】:

我的 Rails 5 应用程序中有一个搜索控制器,如果搜索词为空白,我希望它返回一个状态为 400 的头部,否则搜索并呈现结果页面。

这是我的控制器...

def new
  search_term = search_params[:search].downcase
  head 400 and return if search_term.blank?

  @search_results = Post.where("lower(title) LIKE ? OR link LIKE ?",
                               "%#{search_term}%",
                               "%#{search_term}%").
                         order("created_at DESC").
                         paginate(page: params[:page], per_page: 30)
  if @search_results.empty?
    flash.now[:information] = "No results found"
  end
end

private

  def search_params
    params.require(:search).permit(:search)
  end

我尝试调整 if 和 return 语法,但似乎没有任何效果。当我从没有搜索字符串的视图中单击搜索按钮时,它只会在控制器路径下呈现一个空白页面。我希望它只停留在同一页面上并且什么都不做。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    其实写

    params.require(:search).permit(:search)
    

    使search 参数必须存在且不能为空。

    为了让它起作用,改变它背后的一点逻辑并且不要使用强参数(你正在手动检查它):

    search_term = params[:search]
    head 400 and return if search_term.blank?
    search_term.downcase!
    

    或者您可以通过编写来利用该异常:

    rescue_from ActionController::ParameterMissing, with: :render_error
    
    def new
      search_term = search_params[:search].downcase!
      (rest of your code)
    end
    
    protected
    
    def render_error
      head 400
    end
    

    但这可能被某些人认为是一种反模式。但是我认为这里是合适的,实际上非常明确。

    【讨论】:

    • 第一个例子并没有解决问题,它仍然在搜索路径下呈现一个空白页面。使用第二种解决方案永远不会触发异常,并且所有记录都在页面上返回。 ? 一定有办法!
    • it still renders a blank page under the search path - 这看起来像是发送 400 标头和空正文的完美示例
    • 我在其他地方读到浏览器假定类型 2 和 4 响应代码将带有一个新页面来呈现。我尝试使用 303 等,但没有运气。我使用render :back 得到了一些接近我想要的东西,但是用户体验有点糟糕。我想我会构建一些 Jquery 并让 Ajax 处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多