當我在示例代碼中嘗試了這一點時,我能夠看到的是查詢參數(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 - 返回哈希格式的查詢參數
- POST - 返回後身體在哈希格式
因此,根據params
的代碼,在參數相同的情況下,GET參數應該被POST參數覆蓋。 (self.GET.merge(self.POST)
)。但是,這與我在實際嘗試時得到的結果相反。
所以,唯一的機會是這段代碼被Rails覆蓋。當我想到它時,它非常有意義,因爲來自Rails的params
散列將始終包含"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
和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 - 方法ret甕的請求作爲哈希
- 參數控制器和行動 - 爲
params
別名(就是在這裏覆蓋)
注意,GET方法和POST方法也被覆蓋,主要是轉換散列返回到HashWithIndifferentAccess的對象。
因此,在這裏查看代碼(params = request_parameters.merge(query_parameters)
),顯然在Rails中,在參數相同的情況下,POST參數被GET參數覆蓋。換句話說,GET參數優先於POST參數。
我可能寫了我的問題很差,但我的問題是,如果有post param和查詢參數與相同的密鑰,並通過POST方法請求。哪個優先於哪個? – denniss 2011-12-14 20:03:22
剛做了一個測試,輸入值被忽略,然後`form`標籤中的一個獲得優先級。 – 2011-12-14 20:15:24
真棒謝謝!我也得到了同樣的東西=) – denniss 2011-12-14 20:27:04