2017-12-21 3 views
0

この関数では、priceFloat = price/1を実行してフロートに変換する前に、 "price"変数が0かnilかどうかをチェックする必要があります。エリクシールの確実な値が0またはnilでない

def insert_product_shop(conn, product_id, shop_id, price) do 
    IO.inspect(price, label: "price") 
    priceFloat = price/1 
    changeset = Api.ProductShop.changeset(%Api.ProductShop{p_id: product_id, s_id: shop_id, not_in_shop_count: 0, price: priceFloat}) 
    errors = changeset.errors 
    valid = changeset.valid? 
    case insert(changeset) do 
     {:ok, product_shop} -> 
     {:ok, product_shop} 
     {:error, changeset} -> 
     {:error, :failure} 
    end 
    end 

慣用的な方法は何ですか?

私はこれを試してみましたが、私はまだ算術演算エラーが発生します。

def insert_product_shop(conn, product_id, shop_id, price) do 
    IO.inspect(price, label: "price") 
    case {price} do 
     {price} when price > 0 -> 
     priceFloat = price/1 
     changeset = Api.ProductShop.changeset(%Api.ProductShop{p_id: product_id, s_id: shop_id, not_in_shop_count: 0, price: priceFloat}) 
     errors = changeset.errors 
     valid = changeset.valid? 
     case insert(changeset) do 
      {:ok, product_shop} -> 
      {:ok, product_shop} 
      {:error, changeset} -> 
      {:error, :failure} 
     end 
     end 
    end 

答えて

3

エリクサーで、nil > 0が真であるので、あなたのコードが動作しない理由はあります。あなたは代わりにこれを行うことができます。

if price not in [0, nil] do 
    ... 
else 
    ... 
end 

または

if is_number(price) and price > 0 do 
    ... 
else 
    ... 
end 
+0

完全に動作します。ありがとう。 – BeniaminoBaggins

2

これを行うための慣用的な方法は、関数の節で直接パターンマッチに次のようになります。

def insert_product_shop(conn, product_id, shop_id, price) 
    when not is_number(price), do: {:error, :nil} 
def insert_product_shop(conn, product_id, shop_id, price) 
    when price <= 0, do: {:error, :not_positive} 
def insert_product_shop(conn, product_id, shop_id, price) do 
    priceFloat = price/1 
    changeset = 
    Api.ProductShop.changeset(
     %Api.ProductShop{p_id: product_id, 
         s_id: shop_id, 
         not_in_shop_count: 0, 
         price: priceFloat}) 
    errors = changeset.errors 
    valid = changeset.valid? 

    case insert(changeset) do 
    {:ok, product_shop} -> 
     {:ok, product_shop} 
    {:error, changeset} -> 
     {:error, :failure} 
    end 
end 

第2節がありますガード付きで1つに崩壊する

when not is_number(price) or price <= 0 
+0

ありがとうございます。しかし、このエラーが発生しました。 'no case clause matching:nil' – BeniaminoBaggins

+0

これは不可能です。エラーが発生した場合は、それが起こった正確な行を表示してください。 – mudasobwa

+0

ああ、持っています。あなたの呼び出し元は '{:error、_}'を応答として期待しています。修正された変形を参照してください。あなたの最初の試みにもこの不具合があったことに注意してください。 – mudasobwa

関連する問題