rails Mac にてユーザを登録するだけの簡単Railsアプリの勉強
1年くらい勉強してやっとここまで理解できた。
書籍のチュートリアルをやるだけで理解できず、今度はひとつずつコマンドの意味を確認するようにしたら理解できるようになった。
railsがやっかいなのは、いろいろな記述方法が存在すること。
railsのバージョンによって記載が異なること。
さらに単数か複数が存在すること。
などなど、初心者、独学者にとっては地雷がたくさん存在すること。
なので、WEBの初心者にrailsはおすすめしない。
一旦他の環境(PHP,ASP,JAVA,HTMLなど)で学んでからrailsを学習することを勧める。そうしないとDBなどが理解できない。
以下のパスでやってみる
aidayota-no-MacBook-Pro:site maseda$ pwd
/Users/maseda/Documents/新書類/Webブログ、ネット/ruby_web2/site
aidayota-no-MacBook-Pro:site maseda$
バージョンはRails 5というのがちょっと最新すぎるけど
aidayota-no-MacBook-Pro:site maseda$ rails -v
Rails 5.0.7
aidayota-no-MacBook-Pro:site maseda$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]
SQLite3の確認 たいていMacにはインストールされてる
aidayota-no-MacBook-Pro:simple maseda$ sqlite3 -version
3.24.0 2018-06-04 14:10:15 95fbac39baaab1c3a84fdfc82ccb7f42398b2e92f18a2a57bce1d4a713cbaapl
2019年1月6日
とりあえず、
rails new simple
で簡単な練習をする
ユーザを登録するだけの簡単Railsアプリの勉強
(1)rails new simple
で5分位かかる。いろんなプラグインをインストールしてる。
topコントローラでindexアクションを作成する
(2)aidayota-no-MacBook-Pro:simple maseda$ rails g controller top index
topコントローラのためのtopディレクトリがviewsの中に作成される。
ここでtopは複数ではない。topはモデルがないからかな?
以下で作成するモデルmemberのコントローラはmembersとなり複数となる。ここがややこしい。
(3)config/routes.rb に
root ‘top#index’
を追加した
1 2 3 4 5 |
aidayota-no-MacBook-Pro:simple maseda$ vi config/routes.rb aidayota-no-MacBook-Pro:simple maseda$ rake routes Prefix Verb URI Pattern Controller#Action top_index GET /top/index(.:format) top#index root GET / top#index |
これでトップにアクセスするとtop#indexが実行される。
別のターミナルを起動して
rails s
を実行して簡易サーバを起動させる。
そして
http://localhost:3000
にアクセスすると
vi app/views/top/index.html.erb
の内容が表示される。
つまり、
root ‘top#index’
が実行されたことになる。
—ブラウザの画面
Top#index
Find me in app/views/top/index.html.erb
—
(41)今度はモデル、テーブルを作成する
rails g model member
そして列を追加する。rails では複数にしないがテーブルは複数のmembersテーブルが作成される。
(5)t.string :name, null: false ,NOT NULL制約をいれた
vi db/migrate/20190106024353_create_members.rb
1 2 3 4 5 6 7 8 |
class CreateMembers < ActiveRecord::Migration[5.0] def change create_table :members do |t| t.string :name, null: false #追加 t.timestamps end end end |
(6)rake db:create
でもすでにDBはできてた。でもテストは作成された
aidayota-no-MacBook-Pro:simple maseda$ rake db:create
Database ‘db/development.sqlite3’ already exists
Created database ‘db/test.sqlite3’
(7)そしてマイグレーションする
rake db:migrate
Memberテーブルの照会
aidayota-no-MacBook-Pro:simple maseda$ rails c
Running via Spring preloader in process 43918
Loading development environment (Rails 5.0.7.1)
irb(main):001:0> Member.count
(0.2ms) SELECT COUNT(*) FROM “members”
=> 0
まだ0件。とりあえずmembersテーブル(複数名)があることがわかる
このテーブルにはname列しかない
なおSQLITEで確認するには
aidayota-no-MacBook-Pro:simple maseda$ sqlite3 db/development.sqlite3
SQLite version 3.24.0 2018-06-04 14:10:15
Enter “.help” for usage hints.
sqlite> .tables
ar_internal_metadata members schema_migrations
sqlite> SELECT * FROM members
…> ;
sqlite>
何も登録してないから0件で表示されないけど。
(8)rails g controller members
今度はmembers(複数)コントローラを作る。
モデルと同じ名称(モデルは単数)でテーブル名称は複数membersになる
(9)config/routes.rbに
resources :membersを追加した
1 2 3 4 5 6 |
Rails.application.routes.draw do get 'top/index' root 'top#index' resources :members # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end |
rake routesで確認する。
ここでエラーになったらさっき修正した箇所を確認する。
大抵がつづりを間違っている。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
aidayota-no-MacBook-Pro:simple maseda$ rake routes Prefix Verb URI Pattern Controller#Action top_index GET /top/index(.:format) top#index root GET / top#index members GET /members(.:format) members#index POST /members(.:format) members#create new_member GET /members/new(.:format) members#new edit_member GET /members/:id/edit(.:format) members#edit member GET /members/:id(.:format) members#show PATCH /members/:id(.:format) members#update PUT /members/:id(.:format) members#update DELETE /members/:id(.:format) members#destroy aidayota-no-MacBook-Pro:simple maseda$ |
(次はフォームを登録して、DBに登録内容を追加する。2019年1月6日)
(10)次にmembers_controller.rbにindexアクションを記載する。
1 2 3 4 5 |
class MembersController < ApplicationController def index @members = Member.order("name") end end |
(11)次にapp/views/member/index.html.erbを新規作成して、
コントローラで作成したオブジェクト@members(複数形)を取得して表示する。
テーブルデータが登録されていれば表示する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<h1>member#index</h1> <p>app/views/member/index.html.erb</p> <% if @members.present? %> <table><tr><td> name </td></tr> <% @members.each do |member| %> <tr><td> <%= member.name %> </td></tr> <% end %> </table> <% else %> データがありませんでした <% end %> |
(12)次にテスト用のデータをSQLITEに登録します
membersテーブルは列が一つnameだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
aidayota-no-MacBook-Pro:simple maseda$ rails c Running via Spring preloader in process 46977 Loading development environment (Rails 5.0.7.1) irb(main):001:0> member = Member.new => #<Member id: nil, name: nil, created_at: nil, updated_at: nil> irb(main):002:0> member.name = "taro" => "taro" irb(main):005:0> member.save (0.1ms) begin transaction SQL (0.5ms) INSERT INTO "members" ("name", "created_at", "updated_at") VALUES (?, ?, ?) [["name", "taro"], ["created_at", "2019-01-07 11:05:07.392297"], ["updated_at", "2019-01-07 11:05:07.392297"]] (0.7ms) commit transaction => true irb(main):006:0> Member.count (3.1ms) SELECT COUNT(*) FROM "members" => 1 |
そして
rails s
もし、サーバを起動させていたら一旦停止して再度起動させる。そうしないとDBが反映されない。
http://localhost:3000/members
にアクセスする。
なぜ、membersなのかというと
rake routes
で実行すると
members#indexが表示されることがわかるから。
つまりコントローラのmembers_controller.rbのindexアクションで実行されて検索された@membersがビュー側のview/member/index.html.rbで表示される。
そして、その表示はルートで決まっている。
多分、Railsで訳がわからない人は、表示させるURLが規則に決まって何をどう知るかがわからない。
PHPやHTMLだけで作ってきた人は自由にURLを決めたいのにRailsだと規則を覚えないとわからないから理解できなくなる。
更にコントローラーとビューの関係が理解できないとわからない。
まずはすごくシンプルなアプリを作るところから始めると理解しやすくなる。なんでもシンプルなところからが良いみたい
(次は基礎本のP224 の新規登録をやろうと思う)
app/views/top/index.html.erb
メンバー一覧のためのリンク
1 2 3 |
<h1>Top#index</h1> <p>Find me in app/views/top/index.html.erb</p> <%= link_to "一覧" ,:members %> |
(13)次に
members_controller.rbにnew,show,createメソッドを作成する。
さらにこのメソッドに連携するnew.html,show.htmlを作成する。
http://localhost:3000/
でトップ。
http://localhost:3000/members
で一覧になる。
newは新規登録
showは詳細表示になる
(13)members_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class MembersController < ApplicationController def index @members = Member.order("name") end def new @member = Member.new end def create #Member.new(params[:member])だとエラーになる。 @member = Member.new(params.require(:member).permit(:name)) if @member.save redirect_to @member, notice: "登録しました" else render "new" end end def show #idというカラムはなくても使える @member = Member.find(params[:id]) end end |
(14)
view/member/new.html.erb
1 2 3 4 5 |
<h1>member#new</h1> <%= form_for @member do |form| %> <%= render "form", form: form%> <%= form.submit %> <% end %> |
(15)
view/member/show.html.erb
1 2 3 |
<h1>member#show</h1> name<br> <%= @member.name %> |
(16)新規登録のときの入力フォームは
vidw/member/_form.html.erbを使用する
new.html.erbのformのところで呼び出される。
1 2 3 4 |
新規登録<br> <% @member = Member.new unless @member %> <%= form.label :name,"user" %> <%= form.text_field :name %> |