2017-08-30 194 views
1

我在我的rspec測試中遇到了錯誤天數。後來我發現,問題是用符號代替串字符串vs符號rails

user_response = JSON.parse(response.body, symbilize_names: true) 
expect(user_response[:email]).to eql(@user.email) 

因爲user_response[:email]回報nil因爲某些原因

但是,當我將其更改爲user_responce['email']測試通過

上面的代碼總是失敗

調試與byebug檢查USER_RESPONSE的價值

(byebyg) user_response 
{"id"=>1, "email"=>"[email protected]", "created_at"=>"2017-08-30T14:22:43.597Z", "updated_at"=>"2017-08-30T14:22:43.597Z"} 

什麼在上面的情況下使用符號和字符串之間的區別?

+8

你有一個錯字:'symbilize_names'應該是'symbolize_names' – Stefan

+1

(因此'JSON.parse'應該引發一個'ArgumentError',但這是一個不同的故事) – Stefan

回答

5

在Ruby中使用哈希時,任何對象如字符串或符號都可以用作關鍵字。但是,:email"email"是不同的對象,因此要查找對象,必須使用與用於存儲該值的對象相同的對象。

您可能會困惑的是Rails在某些地方使用HashWithIndifferentAccess。這是一個自定義散列,其中鍵:foo"foo"被認爲是相同的。這使您可以使用例如params[:user]params["user"]可互換,但這不是一般情況。

由於Stefan發現,爲什麼絲線被用於在解析JSON對象的鍵的原因是剛下來在選擇一個小錯字:symbilize_names它應該是symbolize_names

2

符號和字符串只是不同類型的對象。與'5'5不同。他們表面上看似看起來相似,但實際上它們並沒有關係。

在上面的情況下使用符號和字符串有什麼區別?

在你的情況下,你的數據結構包含字符串鍵並且不包含符號鍵。就那麼簡單。

3

這實際上與符號或字符串本身無關。你有一個散列。該散列值包含密鑰'email'的值。它不包含鍵值'foobar'42:hello[1, 2, 3]:email的值。 Ergo,如果你問它其中的一個值,你會得到默認值,默認值爲nil

這不是關於符號或字符串。您只需要詢問散列值是否存在密鑰。在散列中沒有鍵:email,如果您獲得默認值。