2016-08-14 2 views
1

Programming Phoenix에서 Phoenix 프레임 워크를 배우고 있는데 이해할 수없는 오류가 있습니다. 기본적으로이 책은 현재 새로운 사용자를 만들기위한 양식을 추가하는 시점에 있습니다. 내가 http://localhost:4000/users/new에 브라우저를 그래서 나는 (이미지를 확장하십시오) 아래의 페이지를 얻을 :변경 집합의 인수 오류

명령 라인 출력에서 ​​

enter image description here

서버가 말한다 : 오류가 뭔가 말한다

[info] GET /users/new 
[debug] Processing by Rumbl.UserController.new/2 
    Parameters: %{} 
    Pipelines: [:browser] 
[info] Sent 500 in 9ms 
[error] #PID<0.543.0> running Rumbl.Endpoint terminated 
Server: localhost:4000 (http) 
Request: GET /users/new 
** (exit) an exception was raised: 
    ** (ArgumentError) argument error 
     :erlang.binary_to_existing_atom("name,", :utf8) 
     (ecto) lib/ecto/changeset.ex:402: Ecto.Changeset.process_empty_fields/2 
     (elixir) lib/enum.ex:1184: Enum."-map/2-lists^map/1-0-"/2 
     (ecto) lib/ecto/changeset.ex:373: Ecto.Changeset.do_cast/7 
     (rumbl) web/models/user.ex:15: Rumbl.User.changeset/2 
     (rumbl) web/controllers/user_controller.ex:17: Rumbl.UserController.new/2 
     (rumbl) web/controllers/user_controller.ex:1: Rumbl.UserController.action/2 
     (rumbl) web/controllers/user_controller.ex:1: Rumbl.UserController.phoenix_controller_pipeline/2 
     (rumbl) lib/rumbl/endpoint.ex:1: Rumbl.Endpoint.instrument/4 
     (rumbl) lib/phoenix/router.ex:261: Rumbl.Router.dispatch/2 
     (rumbl) web/router.ex:1: Rumbl.Router.do_call/2 
     (rumbl) lib/rumbl/endpoint.ex:1: Rumbl.Endpoint.phoenix_pipeline/1 
     (rumbl) lib/plug/debugger.ex:122: Rumbl.Endpoint."call (overridable 3)"/2 
     (rumbl) lib/rumbl/endpoint.ex:1: Rumbl.Endpoint.call/2 
     (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4 
     (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4 

때문에 binary_to_existing_atom처럼 내가 매개 변수 나 뭔가를 잘못 입력했다고 생각했지만 실제로 그렇지는 않습니다.

내 모델 파일 :

defmodule Rumbl.User do 
    use Rumbl.Web, :model 

    schema "users" do 
     field :name, :string 
     field :username, :string 
     field :password, :string, virtual: true 
     field :password_hash, :string 

     timestamps 
    end 

    def changeset(model, params \\ :invalid) do 
     model 
     |> cast(params, ~w(name, username), []) 
     |> validate_length(:username, min: 1, max: 20) 
    end 
end 

내 마이그레이션 파일 :

defmodule Rumbl.Repo.Migrations.CreateUser do 
    use Ecto.Migration 

    def change do 
     create table(:users) do 
      add :name, :string 
      add :username, :string, null: false 
      add :password_hash, :string 

      timestamps 
     end 

     create unique_index(:users, [:username]) 
    end 
end 

컨트롤러 :

defmodule Rumbl.UserController do 
    use Rumbl.Web, :controller 

    def index(conn, _params) do 
     users = Repo.all(Rumbl.User) 
     render conn, "index.html", users: users 
    end 

    def show(conn, %{"id" => id}) do 
     user = Repo.get(Rumbl.User, id) 
     render conn, "show.html", user: user 
    end 

    alias Rumbl.User 

    def new(conn, _params) do 
     changeset = User.changeset(%User{}) 
     render conn, "new.html", changeset: changeset 
    end 
end 

그리고 마지막으로, 템플릿 :

<h1>New User</h1> 

<%= form_for @changeset, user_path(@conn, :create), fn f -> %> 
    <div class="form-group"> 
     <%= text_input f, :name, placeholder: "Username", class: "form-control" %>   
    </div> 
    <div class="form-group"> 
     <%= password_input f, :password, placeholder: "Password", class: "form-control" %>   
    </div> 
    <%= submit "Create User", class: "btn btn-primary" %> 
<% end %> 

다른 코드가 필요한지 알려주세요. 그리고 미리 감사드립니다!

+1

시도를 주조'에서'name' 후 쉼표를 제거 (매개 변수, ~ (이름, 사용자 이름), [])'이렇게''cast (params, ~ (name username), []) ' – JustMichael

+0

@JustMichael 이유를 설명하고 답으로 추가하십시오. :-) – dotslash

답변

5

~w시길 각 요소 이후에 쉼표를 필요로하지 않지만 사람들을 추가 할 때, 그들은

~w(name, username) 

다음 목록 생성 귀하의 경우에, 그래서 목록 항목에 연결된 얻을 :

["name,", "username"] 

을 그것은 분명히 당신이 원하는 것이 아닙니다.

그래서 당신은 쉼표를 제거해야하고 대신를 사용

~w(name username) 

당신이 기대하고 정확하게 생성하는 :

["name", "username"]