2015-10-24 10 views
10

フェニックスのアプリケーション(Elixirを使用)で特定のキーがあるかどうかを確認する方法を見つけようとしています。エリクシールマップチェックが空でない場合キーが存在する

モデルの以下のチェンジセット機能では、paramsのデフォルトは空です。

def changeset(model, params \\ :empty) do 

という名前のキーがハッシュ内に存在するかどうかを判断する必要があります。

答えて

12

小さな用語だけですが、paramsはハッシュではなくマップです。これは、ドキュメンテーションのどこを調べるかを知るときに関係します。

has_key?/2は、trueまたはfalseを返します。

Map.has_key?(params, :name) 

Ectoチェンジセットを使用しているので、Ecto.Changeset.get_change/3も使用できます。

get_change(changeset, key, default \\ nil) 

keyが設定されていない場合、これはdefaultを返します。 keynilに設定されている場合は、nilが返されます。 nilが変更の許容値である場合は、別のデフォルトパラメータを設定することができます。

9

ガゼラーの答えは明らかに本当に良いです。それは私には思われるように、パターンマッチングを追加するだけです。それはフェニックスだけでなくElixirの任意のマップで動作する、最も明白な解決策です。

# head-only declaration for default params 
def changeset(model, params \\ :empty) 

def changeset(model, %{"username" => _} = params) do 
    # username field is in params 
end 

def changeset(model, params) do 
    # username is not in params 
end 
関連する問題