den*_*iss 9 ruby-on-rails ruby-on-rails-3
假设你有一个网址
localhost:3000?a=1
Run Code Online (Sandbox Code Playgroud)
在请求中,您还有一个post参数
a=2
Run Code Online (Sandbox Code Playgroud)
什么会
params[:a]在这种情况下?它取决于HTTP动词吗?
如果它确实依赖于HTTP动词,
如果你的表格看起来怎么样
<form method='post' action='/?a=2'>
<input type='hidden' name='a' value='3'/>
</form>
Run Code Online (Sandbox Code Playgroud)
params[:a]在这种情况下会是什么?
UPDATE
所以我只做了一个小实验并使用Chrome Debugger附加?authenticity_token=abc了动作网址.我查看了服务器日志,我看到了参数authenticity_token => 'abc'.我也相信这种方法就是POST这种情况.
让我知道你们想出了什么.
rub*_*nce 20
当我在示例代码中尝试这个时,我能够看到的是查询参数(GET)优先于POST主体.所以,我开始研究Rack在Rails中处理HTTP请求的代码.这是来自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
Run Code Online (Sandbox Code Playgroud)
这里,方法
因此,根据代码params,在相同键的情况下,应该通过POST参数覆盖GET参数.(self.GET.merge(self.POST)).但是,这与我实际尝试时的结果相反.
所以,唯一的机会是这个代码被Rails覆盖.当我想到它时,它非常有意义,因为params来自Rails 的哈希将始终包含"controller"和"action"键,在Rack的情况下将不存在.所以,我也查看了Rails的代码,发现该params方法确实被覆盖了.在Rails源代码中查看request.rb和parameters.rb.在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
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
所以在这里
params(在此处被覆盖)注意,GET方法和POST方法也被重写,主要是将返回的哈希转换为HashWithIndifferentAccess的对象.
因此,查看此处的代码(params = request_parameters.merge(query_parameters)),很明显,在Rails中,如果键相同,则GET参数会覆盖POST参数.或者换句话说,GET参数优先于POST参数.
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
Run Code Online (Sandbox Code Playgroud)
注意别名parameters方法.
除非重新定义,否则查询字符串中的参数将覆盖POST正文中的参数.
| 归档时间: |
|
| 查看次数: |
10250 次 |
| 最近记录: |