ruby-on-rails – Rails:查询参数vs post参数
假设你有一个网址
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动作网址.我查看了服务器日志,我看到参数有authenticity_token => ‘ABC’.我也相信在这种情况下该方法是POST. 让我知道你们想出了什么. 解决方法
当我在示例代码中尝试这个时,我能够看到的是查询参数(GET)优先于POST主体.所以,我深入研究了在Rails中处理HTTP请求的Rack代码.这是
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 – 以散列格式返回查询参数 因此,根据params的代码,在相同键的情况下,POST参数应该覆盖GET参数. (self.GET.merge(self.POST)).但是,这与我实际尝试时的结果相反. 所以,唯一的机会是这个代码被Rails覆盖.当我想到它时,它完全有意义,因为来自Rails的params散列将始终包含“控制器”和“动作”键,在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 在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方法的别名 注意,GET方法和POST方法也被重写,主要是将返回的哈希转换为HashWithIndifferentAccess的对象. 因此,查看此处的代码(params = request_parameters.merge(query_parameters)),很明显,在Rails中,如果键相同,则GET参数会覆盖POST参数.或者换句话说,GET参数优先于POST参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |