Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:查询参数vs post参数_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails Rails:查询参数vs post参数

Ruby on rails Rails:查询参数vs post参数,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,假设您有一个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]是什么 更新 所以

假设您有一个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]
是什么

更新

所以我只是做了一个小实验,并使用Chrome调试器附加动作url。我查看了服务器日志,发现参数具有
authenticity\u token=>“abc”
。我还认为,在这种情况下,方法是
POST


让我知道你们想到了什么。

应该是2。但对于路由,它将与“1”匹配


如果需要,您可以使用request.GET和request.POST访问GET和POST变量。

不,它不依赖于de-HTTP动词,但您确实可以有不同的操作来处理
GET
POST
,也可以是相同的,在这两种情况下您都会得到'params[:a'。Rails
Rack::request
,用于HTTP请求。但是,它重新定义了
ActionDispatch::Http::Parameters
中的
Rack
方法(通过别名)

此方法返回请求参数,实现方式如下:

  # 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
注意带别名的
参数
方法


除非重新定义,否则查询字符串中的参数将覆盖帖子正文中的参数。

当我在示例代码中尝试此操作时,我看到的是,查询参数(GET)的优先级高于帖子正文。因此,我深入研究了
Rack
的代码,它在Rails中处理HTTP请求。这是来自的代码

这里,方法

  • GET-以哈希格式返回查询参数
  • POST-以哈希格式返回POST正文
因此,根据
params
的代码,如果键相同,GET参数应该被POST参数覆盖。(
self.GET.merge(self.POST)
)。但是,这与我实际尝试的结果相反

因此,唯一的可能是Rails重写了这段代码。当我想到这一点时,它是非常有意义的,因为Rails中的
参数
散列将始终包含
“controller”
“action”
键,在Rack的情况下,这些键将不存在。因此,我也查看了Rails的代码,发现
params
方法确实被重写了。看看Rails源代码中的和。在这方面,我们有:

  # 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
以及:

那么,这里

  • query\u参数-GET方法的别名
  • 请求\u参数-POST方法的别名
  • path_parameters—将请求的控制器和操作作为哈希返回的方法
  • 参数-参数的别名(此处被覆盖)
请注意,GET方法和POST方法也被重写,主要是为了将返回的哈希转换为HashWithInferenceTaccess的对象


因此,看看这里的代码(
params=request\u parameters.merge(query\u parameters)
),在Rails中,如果键相同,POST参数显然会被GET参数覆盖。或者换句话说,GET参数优先于POST参数。

我可能写得不好,但我的问题是,如果POST参数和query参数具有相同的键,并且是通过POST方法请求的,该怎么办。哪一个优先于哪一个?刚刚做了一个测试,输入值被忽略,然后
表单
标签中的一个优先。那么你能解释一下为什么我的实验给了我这个结果吗?它正在更新中,我错过了一段关键的代码。ActionDispatch::Request包括ActionDispatch::Http::Parameters,它重新定义了参数。更新我的答案。@toddsundsted..+1..你在更新答案方面也打败了我:)补充说明你可以访问控制器方法中的
ActionDispatch::Request
对象:
Request。查询参数
Request。来自任何控制器方法的请求参数
将通过键入@keaplogik,这绝对值得注意。
  # 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
# 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