在调用操作之前检查rails中是否存在头属性

时间:2015-09-05 12:02:06

标签: ruby-on-rails ruby rails-routing ruby-on-rails-4.2

我正在rails 4中构建一个API。在调用一个动作之前,我首先尝试检查http头中是否存在一个属性。有没有办法做到这一点,而不是检查控制器的所有动作中的每一个。 rails文档提到了类似

的内容
constraints(lambda { |req| req.env["HTTP_CUSTOM_HEADER"] =~ /value/ }) do
  #controller, action mapping
end

但我仍然想让用户使用我的API反馈。比如发送带有消息的json:missing the custom attribute in the header

3 个答案:

答案 0 :(得分:4)

您可以将before_action添加到控制器并检查标题属性,例如:

class SomeController < ApplicationController
  before_action :render_message, unless: :check_header

  def check_header
    request.env["HTTP_CUSTOM_HEADER"] =~ /foo/
  end

  def render_message
    render json: { message: "missing the custom attribute in the header" }
  end
end

如果check_attribute过滤器返回nil,则render_message操作会呈现所需的消息。

答案 1 :(得分:1)

您可以使用before_action过滤器检查控制器操作:

例如wbput.sh foo_1.2-3.tar.gz

APIController

答案 2 :(得分:0)

如果标头存在作为一种认证机制,那么没有必要点击后端,尝试在反向代理端提前避免它:

nginx.conf

server {
  location / {
    if ($http_x_custom_header) {
      return 200 'missing the custom attribute in the header'; 
    }
    proxy_pass...
  }
}