web-dev-qa-db-ja.com

アクセスRubyハッシュ変数

私はRubyとsinatraにかなり慣れていますが、基本的には次のルートを持っています:

put '/user_list/:user_id' do
    puts request.params["model"]
end

そしてそれは次を返します

{"password":"36494092d7d5682666ac04f62d624141","username":"nicholas","user_id":106,"firstname":"Nicholas","email":"[email protected]","is_admin":0,"lastname":"Rose","privileges":""}

現在、それらのそれぞれの値にアクセスするのに苦労しています。それは本当にハッシュ形式ではないようですので、実際にはできません

request.params["model"][:password]

単にnilを返します。

これらの変数にアクセスするために何ができるか、または変数にアクセスするためにリクエストパラメータを適切な形式に設定する方法を知る必要があります。

16
Blaine Kasten

request.params["model"]["password"]をお試しください

Hashのキーは、記号と文字列の両方で構成できます。ただし、文字列キーは記号キーとは異なります。

次の点に注意してください。

h = {:name => 'Charles', "name" => 'Something else'}
h[:name] #=> 'Charles'
h["name"] #=> 'Something else'

編集:

特定の状況では、request.params["model"]がハッシュではなく文字列を返すようです。メソッドがあります String#[] これは部分文字列を取得する手段です。

s = "Winter is coming"
s["Winter"] #=> "Winter"
s["Summer"] #=> nil

これはあなたのコメントを説明するでしょう。

特定の状況を改善するためにできることがいくつかあります。 JSONを使用する最も簡単な方法を見つけました。 (他にもあると思いますが、おそらく他の回答やコメントを通じて明らかになるでしょう。)

require 'json'
hash_of_params = JSON.load(request.params["model"]).to_hash
hash_of_params["password"] #=> "36494092d7d5682666ac04f62d624141"
44

標準のハッシュでは、文字列とシンボルの扱いが異なります。この場合は、それが実現することを望んでいます。

使用する request.params["model"]["password"]パスワードを取得します。

その例外は、ActiveSupportの一部である HashWithIndifferentAccess を使用する場合です。そのタイプのハッシュの場合、文字列またはシンボルを使用して同じ要素にアクセスできます。

5
user1454117

以下を試してください、それも動作します:

request.params["model"][:password.to_s]
0
Arup Rakshit