Ruby on rails Rails:查询参数vs post参数
假设您有一个urlRuby 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]是什么 更新 所以
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'。RailsRack::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—将请求的控制器和操作作为哈希返回的方法
- 参数-参数的别名(此处被覆盖)
因此,看看这里的代码(
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