Ruby
Rails
マストドン

マストドドン Rails

More than 1 year has passed since last update.

Ruby on Rails

バージョン

$ rails -V
rake, version 12.0.0

アプリケーションの作成と初期ファイル群

$ # 新しいアプリケーションの作成
$ rails new MY-APP-NAME
$ cd MY-APP-NAME
$ ls | grep .

Gemfile
Gemfile.lock
README.md
Rakefile
bin
app      # よく使う
config   # よく使う
db       # よく使う
config.ru
lib
log
public
test
tmp
vendor

$ ls app | grep .
assets
channels
controllers
helpers
jobs
mailers
models
views

$ ls config | grep .
application.rb
boot.rb
cable.yml
database.yml
environment.rb
environments
initializers
locales
puma.rb
routes.rb
secrets.yml
spring.rb

$ ls db | grep .
development.sqlite3
seeds.rb

モデル

モデルの作成

規約ではモデル名は単数名、最初が大文字。

$ rails g model モデル名 属性名:タイプ
$ rails g model Human name:string age:integer
$ rails g model House name human:references

モデルの関連付け

HouseはHumanへの参照を持っている。

$ rails g model Human name:string age:integer
$ rails g model House name human:references
app/models/house.rb
class House < ActiveRecord::Base
  belongs_to :human # 自動で付加される
end

Humanのほうは自動で関連付けをしてくれないので以下を書き加える。
Humanは複数のHouseに参照されるので一対多の依存関係。

class Human < ActiveRecord::Base
has_many :houses # 一対多の関係
end

ビュー

ビューの作成

app/views/コントローラ名/以下にファイルを作成する。コントローラがhumans#index ならビューのパスはhumans/index.html.erbとなる。

erbファイルの記法

ループ文

<ul>
  <% @humans.each do |human| %>
    <li><%= human.name %></li>
  <% end %>
</ul>

image_tag

<%= image_tag "logo.png" %>

app/assets/images 以下の logo.png を見に行く。

link_to

<%= link_to "リンク名", "リンク先" %>
<%= link_to "Top", "/" %>

基本。

<%= link_to "Top", humans_path %>

humans_pathrails routesで表示されるPrefixカラムに_pathを付けた値。

<%= link_to "Human", humans_path(human.id) %>

rails routesで表示されるPrefixカラムhumanが、例えば以下だった場合、

     human GET    /humans/:id(.:format)      humans#show

リンクでは:idが必要とされているのでhumans_path(human.id)の記述が必要になる。

             DELETE /humans/:id(.:format)      humans#destroy

DELETE メソッドをリンクから呼び出したい時、link_tomethodを記述する。

<%= link_to "[Delete]", human_path(project.id), method: :dele    te, data: { confirm: "削除しますか?" } %> 

form_for

new アクションの @human

app/controllers/humans_controller.rb
...
  def new
    @human = Human.new
  end
...

new.html.erb に渡されて form_for にあんなことをされる。

app/views/humans/new.html.erb
<%= form_for @human do |el| %>

  <%= el.label :name %>
  <%= el.text_field :name %>

  <%= el.submit %>

<% end %>
app/controllers/humans_controller.rb
def create
  # app/views/humans/new.html.erb で submit されるとこのアクションが呼ばれる。
  # 詳しくは rails routes を参照。
  @human = Human.new(human_params)
  @human.save
  redirect_to humans_path
end

private

  def human_params
    # フォームデータのフィルタリングを行なう
    params[:human].permit(:name)
  end

パーシャル

例えばフォームをDRYにしたい時、

app/views/humans/new.html.erb
render "form"
app/views/humans/edit.html.erb
render "form"

_form.html.erbというアンダーバー付きのパーシャルを作成する。

$ touch app/views/humans/_form.html.erb

レイアウト

views/layouts 以下に共通点プレートファイルがある。

コントローラ

コントローラの作成

規約ではコントローラ名はモデル名の複数形。

$ rails g controller コントローラ名
$ rails g controller Humans

$ ls app/controllers/
application_controller.rb  concerns  humans_controller.rb

コントローラのメソッド

指定パスへのリダイレクト。

redirect_to
redirect_to humans_path

ビューの描画。

render
render 'new'

アクションのparams

paramsからURLのパラメータが取れる。

def show
  @human = Human.find(params[:id]) # /humans/:id の :id
end

before_action

コントローラのアクションが呼ばれる前に処理するアクションを書ける。
set_humanshow',editアクションが呼ばれるときに前もって呼ばれるので、showeditアクション内ではfind`する必要がなくコード量を減らせる。

class HumansController < ApplicationController

  before_action :set_human, only: [:show, :edit]

  def set_human
    @human = Human.find(params[:id])
  end

end

ルーティング

URL を自動生成させる命令を書く。

$ vi config/routes.rb
...
  root 'humans#index' # '/' を '/humans' に委譲。
  resources :humans # '/humans' の命令。
...

ルーティングのネスト

config/routes
Rails.application.routes.draw do
  resources :humans do
    # humans 以下に houses のルーティングを create と destroy だけ追加
    resources :houses, only: [:create, :destroy]
  end
end

現在のルーティングの確認。

$ rake routes
$ rake routes
      Prefix Verb   URI Pattern                  Controller#Action
      humans GET    /humans(.:format)          humans#index
             POST   /humans(.:format)          humans#create
 new_project GET    /humans/new(.:format)      humans#new
edit_project GET    /humans/:id/edit(.:format) humans#edit
     project GET    /humans/:id(.:format)      humans#show
             PATCH  /humans/:id(.:format)      humans#update
             PUT    /humans/:id(.:format)      humans#update
             DELETE /humans/:id(.:format)      humans#destroy

Controller#Actionのカラムはコントローラ名:アクション名で「GET /humansの処理を書きたいならhumans#indexに書けよ」という意味。

マイグレーション

$ rake db:migrate

バリデーション

app/models以下のモデルにバリデーションを記述する。
モデルのセーブ時にバリデーションが走る。

class Human < ActiveRecord::Base
  validates :name, presence: true # 'presence true'で'name'が必須フィールドになる
end

{ message: "" }でバリデートエラー時のメッセージを変更できる。

class Human < ActiveRecord::Base
  validates :name, presence: true { message: "不正な入力です。" }
end

バリデーションに失敗するとsaveに失敗する。

if human.save
  # success to save
else
  # failed to save
end

参照: http://qiita.com/shunhikita/items/772b81a1cc066e67930e

DBへのアクセス

$ rails db

コンソール

Djangoでいうところのpython3 manage.py shell的なコマンド。
使用中のDBに反映される。

$ rails console
> m = Human.new(name: "aho", age: 0)
> m
> m.save
> m
>
> m = Human.create(name: "manuke", age: 1)
> m

Rails の作業フロー

  • rails g modelでモデルを作成。
  • rake db:migrateでモデルのマイグレーションをDBに適用。
  • config/routes.rbにルーティングを記述。
  • rails routesでルーティングを確認。
  • app/controllers以下のコントローラにアクションを記述。
  • app/views/コントローラ名/アクション名.html.erbに出力を記述。
  • rails sで開発サーバーを起動して出力を確認。

参考

http://dotinstall.com/lessons/basic_rails_v2