URL http://connpass.com/event/22061/
ドットインストールのRails 4のを見ながらElixir/Phoenixやってみる。
・ドットインストール http://dotinstall.com/lessons/basic_rails_v2/
Elixir は ErlangのVM上で動くプログラミング言語です。 Elixirのバージョン確認
> elixir -v Elixir 1.0.5
mix・・・ビルド用のコマンド ※Rubyでいうgemとrakeみたいなもの?
バージョン確認
> mix help | grep phoenix mix phoenix.new # Create a new Phoenix v1.0.2 application
v1.0.2が入ってた。
mix phoenix.new --version
今(2015/11/01 Sun)は、1.0.3が最新。 ※最新版はここのリリースノートみるのがいい? https://github.com/phoenixframework/phoenix/releases/
ここ参考にアップデートした http://www.kaeruspoon.net/articles/1135
v1.0.2を一旦消す。
mix archive.uninstall phoenix_new-1.0.2.ez
そのままインストールするとエラーになるらしいのでダウンロードしてから入れる
https://github.com/phoenixframework/phoenix/releases/download/v1.0.3/phoenix_new-1.0.3.ez
を適当におとして(なぜかcurl -O
だとファイル壊れた)、
mix archive.install ./phoenix_new-1.0.3.ez
05 タスク管理アプリを作ってみよう
ゼロからタスク管理アプリを作ってみます。まずはModelの設定を行っていきます
→01〜04は飛ばす
Project - Task
taskapp
新規作成
Railsコマンド
rails new taskapp --skip-bundle
Phoenixコマンド
mix phoenix.new taskapp
※SQLiteにしたい場合、おそらくデフォルトはPostgreSQL
mix phoenix.new taskapp --database sqlite
新規作成
Railsコマンド
rails g model Project title rake db:migrate
Phoenixコマンド
モデル名: Project テーブル名: projects
mix phoenix.gen.model Project projects title:string
したあと
mix ecto.migrate
をする前に、
sqliteにしたいので、まず、mix.exsを以下のように編集
http://qiita.com/tatarou1986/items/5e1a8761809dc344ad0d を参考にした
def application do [applications: [:logger, :sqlite_ecto, :phoenix_ecto]] end # 新規作成時にsqliteのオプションを付けてもこれは必須かもしれない・・・ defp deps do [{:sqlite_ecto, "~> 1.0.2"}] end
編集後依存関係の解決
mix deps.get
変なwarning出たが無視したw。
c_src/sqlite3.c:8863:26: warning: unused variable 'sqlite3one' [-Wunused-const-variable] SQLITE_PRIVATE const int sqlite3one = 1;
mix ecto.migrate
(Mix) The task "compile.phoenix" could not be found.
ん?わからないのでとりあえずElixirをアップデート
アップデート
sudo brew update sudo brew unlink elixir sudo brew install elixir
Elixir 1.1.1にした!
しかし、
** (ArgumentError) raise/1 expects an alias, string or exception as the first argument, got: {:cantopen, 'unable to open database file'} (ecto) lib/ecto/pools/poolboy.ex:115: Ecto.Pools.Poolboy.do_checkout/4 (stdlib) timer.erl:166: :timer.tc/1 (ecto) lib/ecto/pools/poolboy.ex:82: Ecto.Pools.Poolboy.checkout/3 (ecto) lib/ecto/pool.ex:169: Ecto.Pool.checkout/3 (ecto) lib/ecto/pool.ex:156: Ecto.Pool.do_run/4 (ecto) lib/ecto/adapters/sql.ex:244: Ecto.Adapters.SQL.query/6 (ecto) lib/ecto/adapters/sql.ex:222: Ecto.Adapters.SQL.query/5 (ecto) lib/ecto/adapters/sql.ex:183: Ecto.Adapters.SQL.query!/5 (elixir) lib/enum.ex:1387: Enum."-reduce/3-lists^foldl/2-0-"/3 lib/sqlite_ecto.ex:33: Sqlite.Ecto.execute_ddl/3 (ecto) lib/ecto/migrator.ex:36: Ecto.Migrator.migrated_versions/1 (ecto) lib/ecto/migrator.ex:134: Ecto.Migrator.run/4 (ecto) lib/mix/tasks/ecto.migrate.ex:62: Mix.Tasks.Ecto.Migrate.run/2 (mix) lib/mix/cli.ex:55: Mix.CLI.run_task/2 (elixir) lib/code.ex:363: Code.require_file/2
DBがない?
おそらくこれでDBを先に作る?
mix ecto.create
が何のコマンドかわからなかったがDBを作るコマンドのよう
> mix ecto.create The database for Taskapp.Repo has been created.
再度
mix ecto.migrate
14:55:49.178 [info] == Running Taskapp.Repo.Migrations.CreateProject.change/0 forward 14:55:49.178 [info] create table projects 14:55:49.183 [info] == Migrated in 0.0s
試しに起動
mix phoenix.server
いけた。
06 rails db/rails consoleを使おう
データベースやオブジェクトをインタラクティブに操作できるrails db/rails consoleコマンドの使い方について説明していきます。
→ 飛ばす
07 Controllerを作ってみよう
Controllerを作った後にルーティングの設定をしていきます。
08 Projectsの一覧を表示させよう
projects#indexアクションを作り、viewを作成することでProjectsの一覧を表示させます。
07と08を同時にやる actionは07では言ってないから。
コントローラを作ってみる
Railsコマンド
rails g controller Projects
projects#index
相当も必要
Phoenixコマンド
mix phoenix.gen.controller projects index
と思ったが、
** (Mix) The task "phoenix.gen.controller" could not be found. Did you mean "phoenix.gen.html"?
deprecatedなのかな?警告通りのコマンドを参考に、
mix phoenix.gen.html project index
に置き換えた。
さっきのModelを上書きしたのだがそのまま上書きした。
mix ecto.migrate
変なエラー。
Compiled web/models/project.ex == Compilation error on file web/controllers/project_controller.ex == ** (CompileError) web/controllers/project_controller.ex:25: function project_path/2 undefined (stdlib) lists.erl:1337: :lists.foreach/2 (stdlib) erl_eval.erl:669: :erl_eval.do_apply/6 (elixir) lib/kernel/parallel_compiler.ex:100: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/8
https://chodounsky.net/2015/06/02/adding-ecto-model-in-phoenix-throws-path-slash-3-undefined/ を参考、
web/router.exに追加してみる。最後の方にやってみた。
get "/", PageController, :index # Project追加 resources "/project", ProjectController
resourcesのあとの文字列はURLであり、
フォルダ自体は「project」なので「projects」としてはダメ。
先ほどのコマンドでweb/controllers/project_controller.ex
にコントローラがあるようだ。
結局CRUDを作るscaffoldingだったかも??
mix ecto.migrate
が成功した。
mix phoenix.server
で起動しhttp://localhost:4000/projects/にアクセス。
テンプレートはここでいじる
web/templates/project/index.html.eex
10 共通テンプレートを編集しよう
共通テンプレートの編集方法、image_tagやlink_toの使い方について学びます。
web/templates/layout/app.html.eex