2011-06-22 17 views
4

Rails 3的問題。獲取原始參數而不是「加工成哈希」版本

如果我發送這樣PUT http://myapp/posts/123?post [title]=hello

的請求,然後在我的控制,我得到params = {:id => 123, :post => {:title => "hello"}}

這是罰款正常,通常可用於如Post.create(params[:post])

然而,在此之際,我需要得到訪問參數的「原始」形式,所以我可以命令他們提取值,將它們全部作爲簡單字符串處理,即我要列出它們,因此參數名稱爲"post[title]",參數值爲"hello"

有沒有什麼辦法讓我獲得這些價值?我認爲可能有一個方法request有參數在他們原來的粘性形式,但我找不到一個。

我曾想過嘗試使用to_param將散列轉換回字符串,但這看起來很髒但可能是不必要的。

作爲獎勵,我希望它忽略:id參數,從字面上只是採取後的部分?在原始請求中。事實上,如果我可以找回原始請求字符串,即"http://myapp/posts/123?post[title]=hello"那麼這樣做:我可以拆分?並從那裏拿走。我想到我可能會把它從頭文件中刪除。但是在此期間,如果有誰知道一個更好的方式,然後請告訴我:)

感謝您的任何意見 - 最大

回答

6

請不要手動解析。從Rails request抓住URI:

url = request.url 
# Or, depending on the Rails version and stack 
url = request.request_uri 
# Or even 
url = request.scheme + '://' + request.host_with_port + request.fullpath 

request.url的返回值似乎取決於你的服務器堆棧上,request.request_uri應該解決這個問題,但似乎並沒有對Rails 3.1存在。第三個「自己構建」方法應該能夠在任何地方產生一致的結果。嘆。

然後,一旦你的URI,使用URI.parseURI.decode_www_form解析它:

u = URI.parse(url) 
q = URI.decode_www_form(u.query) 
# if u.query was "a=b&c=d&a=x" then q is 
# [["a", "b"], ["c", "d"], ["a", "x"]] 
+0

我不知道我怎麼錯過request.url,我想我試了一下,得出一個空白,但顯然搞砸了,因爲這給了我現在的完整網址,謝謝。然而,'URI.decode_www_form(u.query)'被'NoMethodError炸燬了(當你沒有想到它的時候,你有一個零對象! 你可能已經期望了一個Array的實例 評估nil時發生錯誤。空嗎?):' –

+0

更多信息:request.url實際上只是爲我返回路徑部分(這就是爲什麼我早點打折)。所以,我想這意味着一些變量來保存參數被設置爲零,這是你的代碼示例隨後炸燬的。 –

+0

@Max:哪個版本的Ruby和Rails和什麼是'u.class'?如果你只是從'request.uri'獲得這條路徑,那麼'URI.parse'不會給你一個'URI :: HTTP',所以不需要'query'方法。 –

3

Request#bodyRequest#uri應該幫助你。你可以得到「原始」請求數據,但不是一些中間形式......儘管如果你想要鍵值對,然後再在「=」處分割並不難;)