Rails: параметр запроса против параметра post - PullRequest
9 голосов
/ 14 декабря 2011

Предположим, у вас есть URL

localhost:3000?a=1

и в запросе у вас также есть параметр post

a=2

Что бы

params[:a] быть в этом случае? зависит ли это от HTTP-глагола?

Если это зависит от глагола HTTP,

что если ваша форма выглядит как

<form method='post' action='/?a=2'>
  <input type='hidden' name='a' value='3'/>
</form>

что будет params[:a] в этом случае?

UPDATE

Итак, я просто провел небольшой эксперимент и использовал Chrome Debugger для добавления ?authenticity_token=abc URL-адреса действия. Я посмотрел журнал сервера и увидел, что параметры имеют authenticity_token => 'abc'. Я также считаю, что в этом случае метод POST.

Дайте мне знать, что вы, ребята, придумали.

Ответы [ 4 ]

20 голосов
/ 15 декабря 2011

Когда я попробовал это в примере кода, я смог увидеть, что параметрам запроса (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.

6 голосов
/ 15 декабря 2011

Rails использует Rack::Request для HTTP-запросов. Однако он переопределяет метод Rack params в ActionDispatch::Http::Parameters (через псевдоним).

Этот params метод, который возвращает параметры запроса, реализован как:

  # 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

Обратите внимание на псевдоним parameters метод.

Если не переопределено, параметры из строки запроса будут перезаписывать параметры из тела POST.

1 голос
/ 14 декабря 2011

Нет, это не зависит от глагола de HTTP, но вы наверняка можете иметь разные действия для обработки GET и POST или они могут быть одинаковыми и вы получите `params [: a] в обоих случаях.

1 голос
/ 14 декабря 2011

Было бы 2. Но для маршрутизации это будет соответствовать «1».

Если хотите, вы можете использовать request.GET и request.POST для доступа к get и post.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...