如果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
但有没有更好的方法来做这个伎俩? 感谢。
答案 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网页。