Когда я попробовал это в примере кода, я смог увидеть, что параметрам запроса (GET) дан приоритет, а не тело POST.Итак, я углубился в код Rack
, который обрабатывает HTTP-запросы в Rails.Вот код из request.rb
# Returns the data recieved in the query string.
def GET
....
end
# Returns the data recieved in the request body.
#
# This method support both application/x-www-form-urlencoded and
# multipart/form-data.
def POST
....
end
# The union of GET and POST data.
def params
@params ||= self.GET.merge(self.POST)
rescue EOFError
self.GET
end
Здесь метод
- GET - возвращает параметры запроса в хеш-формате
- POST - возвращает тело сообщения в хеш-формате
Таким образом, согласно коду для params
, параметры GET должны быть переопределены параметрами POST в случае идентичных ключей.(self.GET.merge(self.POST)
).Но это противоречит тому, что я получил, когда попробовал это на практике.
Итак, единственный шанс состоит в том, что этот код переопределяется Rails.Когда я думал об этом, это имело смысл, поскольку хэш params
от Rails всегда будет содержать ключи "controller"
и "action"
, которые будут отсутствовать в случае Rack.Итак, я также посмотрел на код Rails и обнаружил, что метод params
действительно переопределяется.Взгляните на request.rb и parameters.rb в исходном коде Rails.В parameters.rb мы имеем:
# Returns both GET and POST \parameters in a single hash.
def parameters
@env["action_dispatch.request.parameters"] ||= begin
params = request_parameters.merge(query_parameters)
params.merge!(path_parameters)
encode_params(params).with_indifferent_access
end
end
alias :params :parameters
и в request.rb :
# Override Rack's GET method to support indifferent access
def GET
@env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
end
alias :query_parameters :GET
# Override Rack's POST method to support indifferent access
def POST
@env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
end
alias :request_parameters :POST
Итак, здесь
- query_parameters - псевдоним для метода GET
- request_parameters - псевдоним для метода POST
- path_parameters - метод, который возвращает контроллер и действие для запроса в виде хэша
- параметры - псевдоним для
params
(здесь он был переопределен)
Обратите внимание, что метод GET и метод POST также были переопределены, главным образом для преобразования хэша, возвращенного в объект HashWithIndifferentAccess.
Итак, глядя на код здесь (params = request_parameters.merge(query_parameters)
), становится очевидным, что параметры POST переопределяются параметрами GET в случае идентичных ключей в Rails.Или, другими словами, параметры GET имеют приоритет над параметрами POST.