2017-01-06 3 views
1

я исследую мир эликсира и построить следующее:Проверьте, если параметр URL является номер

defmodule Hello do 
    def init(default_opts) do 
    IO.puts "starting up App..." 
    default_opts 
    end 

def call(conn, _opts) do 
    route(conn.method, conn.path_info, conn) 
end 

def route("GET", ["customers", cust_id], conn) do 
    # check parameter 
    IO.puts user_id 
    IO.puts "Check if user_id is a number:" 
    IO.puts is_number(cust_id) 

    if is_number(cust_id) do 
    conn |> Plug.Conn.send_resp(200, "Customer id: #{cust_id}") 
    else 
    conn |> Plug.Conn.send_resp(404, "Couldn't find customer, sorry!") 
    end 

end 

Я задаюсь вопросом, почему is_number функция (или is_integer) дает ложное как результат. Используемый мной URL-адрес: http://localhost:4000/customers/12

ответ

1

is_number(cust_id) false, потому что cust_id - это строка, содержащая целые цифры, но это не цифра. Он может быть разобран в целое число, но это строка, потому что conn.path_info не автоматически конвертирует целые строки в целые числа. Вы можете проверить, является ли строка действительным целым числом, используя Integer.parse/2:

if match?({_, ""}, Integer.parse(cust_id)) do 
    conn |> Plug.Conn.send_resp(200, "Customer id: #{cust_id}") 
else 
    conn |> Plug.Conn.send_resp(404, "Couldn't find customer, sorry!") 
end 
Смежные вопросы