如果请求URL在Rails中包含无效参数,重定向404的最佳方法是什么?

时间:2015-11-11 06:11:05

标签: ruby-on-rails-4

如果request url包含invalid parameters,我想重定向到404,但我不知道实现这一目标的最佳方法是什么。 例如: 请求网址:http://example.com/a_path/?invalid_parameter=foo 在这种情况下,我希望rails返回404.我的愚蠢方法是迭代params并检查是否包含无效键:

def redirect_404_if_invalid_params
  valid_params = [:valid_key_1, :valid_key_2, :valid_key_3]
  params.each do |key, value|
    if !valid_params.include?(key)
      redirect 404
    end
  end
end

但有没有更好的方法来做这个伎俩? 感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用强参数来过滤掉动作中不需要的参数。为此,您必须设置:

ActionController::Parameters.action_on_unpermitted_parameters = :raise

因此,只要您收到未明确允许的参数,强参数就会失败。然后,指定您希望可用的参数,例如:

def valid_params
  params.require(:param_a).permit(:attr_a, :attr_b)
end

并使用valid_params[:attr_a]之类的参数,而不是直接引用params

你可以抓住ActionController::UnpermittedParameters并相应地扔掉你的404或做你可能需要做的任何其他事情,但我不建议你这样做。 404是“Not Found”的HTTP错误,无效参数听起来更像422,“Unprocessable Entity”。

答案 1 :(得分:0)

假设你出于某种原因想要做到这一点,这是一种紧凑的方式。

  { 
     "concepts" : [ 
         {
            "score" : ...,
            "concept" : {
                "id": "........",
                "label": ".....

             }
          }, .....
      ]
  }

取所有参数,删除所有已知的有效参数。如果剩下的东西,它必须是无效的密钥。在这种情况下,加注。

BTW,上面代码中的valid_params = [:valid_key_1, :valid_key_2, :valid_key_3] if (params.keys - valid_params.map(&:to_s)).present? not_found end 定义为in this answer

尽管在大多数情况下不需要这样做,但应使用强参数。有了强参数,这是另一种方法:我们不关心未知参数,我们只提取已知的好参数并丢弃其余参数。

答案 2 :(得分:0)

我遇到了同样的问题,并进行了广泛的研究。这是我的解决方案: 在我的application_controller.rb中,我这样做了:

rescue_from ActiveRecord::RecordNotFound, with: :not_found 
rescue_from Exception, with: :not_found
rescue_from ActionController::RoutingError, with: :not_found

def raise_not_found     
   raise ActionController::RoutingError.new("No route matches # {params[:unmatched_route]}")
end

def not_found
  respond_to do |format|
   format.html { render :file => "#{Rails.root}/public/404", :layout =>  false, :status => :not_found }
   format.xml { head :not_found }
   format.any { head :not_found }
  end
end

然后在您的routes.rb文件中执行以下操作:

get '*unmatched_route', to: 'application#raise_not_found'

代码的作用是什么。

您可能知道rescue_from代码行的作用。

raise_not_found if你输入的路由文件中的代码行。此方法触发RoutingError,当发生这种情况时,将调用not_found。

任何未在您的路线文件中退出的网址都会产生404.html网页。