2017-12-21 15 views
0

priceFloat = price/1을 수행하여 float로 변환하기 전에이 함수에서 "price"변수가 0인지 또는 nil인지 확인해야합니다. 그렇지 않으면 산술 오류가 발생합니다.Elixir 보장 값이 0 또는 0이 아닌지 확인

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 

먼저이 절을 수도 경비원과 함께 하나로 붕괴된다.

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

감사합니다. 그래도이 오류가 발생했습니다. 'no case clause matching : nil' – BeniaminoBaggins

+0

이것은 불가능합니다. 오류가 발생했습니다. 발생하는 정확한 줄을 표시하십시오. – mudasobwa

+0

아, 알겠습니다. 호출자는'{: error, _}'를 응답으로 기대합니다. 수정 된 변형을 참조하십시오. 귀하의 초기 시도에도이 결함이있었습니다. – mudasobwa