2016-08-14 13 views
1

本のフェニックスフレームワークをProgramming 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 Whoa、this worked!理由を説明し、答えとして追加してください。 :-) – dotslash

答えて

5

~w印章は、各要素の後にカンマを必要としませんが、あなたがそれらを追加するときに、あなたのケースで

~w(name, username) 

には、以下のリストを生成して、それらがリスト項目に連結されます:

["name,", "username"] 

明らかにあなたが望むものではありません。

だから、あなただけのカンマを削除する必要がありますし、代わりにこれを使用する:

あなたが期待しているまさに発生
~w(name username) 

["name", "username"] 
関連する問題