アプリなどを開発するブログ

React Native / Swift / Ruby on Railsなどの学習メモ。


Ruby on Rails 初学メモ

dotinstall見ながら勉強中。
http://dotinstall.com/lessons/basic_rails_v2

あくまで自分用メモですので、これだけ見てもよくわからんと思います。
サイトで動画を御覧ください。
しかし、こんなレッスンが無料って素晴らしいですよね。

modelの作成

$ rails generate model Project title:string
規約
  • モデル名は単数形。
  • 頭文字は大文字。
省略できるオプション
  • generateはgに省略できる。
  • 属性のデフォルトはstringなので、省略できる。
$ rails g model Project title

モデルを作ったらmigrateでDBに反映させる。

$ rake db:migrate

コンソールからインスタンスを追加する

$ rails console
$ p = Project.new(title:"prj1")
$ p.save

# new & save
$ p = Project.create(title:"prj2")

# コンソール終了
$ quit

使用中のDBにアクセス

$ rails db

# そのままDBをいじれる
$ .schema
$ select * from projects;
$ .exit

コントローラーの作成

$ rails g controller Projects
#規約

コントローラーの名前は、複数形にする。

ルーティングを設定

config/routes.rbファイルに以下を追加

resources :projects

routes コマンドで、ルーティングが表示される。

$ rake routes

このルーティングの表を元に、ビューやコントローラーの
構成を作っていく。

view を追加

controllers/projects_controller.rbに以下のメソッド追加。

def index
    @projects = Project.all
end

規約に従って、viewの関数名と同じファイル名のhtml.erbファイルを新規作成する。
views/projects/index.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>Taskapp</title>
  <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body>
<%= image_tag "logo.png" %>
<%= yield %>

<%= link_to "Back to HOME" "/" %>
<%= link_to "HOME" projects_path %>
</body>
</html>

<Task App>

<%= は、以下のプログラムを評価して表示する。 [prefix]_path で、それぞれのパスが代入される。

URLのルーティングを変更

ルート(domain.com/)をprojects#indexに設定

routes.rbに以下を追加

root 'projects#index'

共通テンプレートの編集

共通テンプレートはviews/layout/application.html.erb ファイル。

それぞれのモデルのページへリンクを貼る

index.html.erb

<ul>
    <% @projects.each do |project| %>
        <li><%= link_to project.title, project_path(project.id) %></li>
    <% end %>
</ul>

link_to を使用。 project.title と一緒にリンク先 project_path(id名) を渡す。
id名はproject.id で取得可能。

それぞれのモデルのページをつくる

projects_controllerに #showを作成

def show
    @project = Project.find(params[:id])
end

モデル名.find( ID ) で、該当するIDのモデルインスタンスを取得。
paramsには渡されたパラメータが入っていて、
この中から :id を取得して findの引数に渡す。

ルーティングやパラメータ値はこの表を参考に。

モデルの追加ページをつくる

new にフォームを設置。
POSTで送ってcreateで受け取り、実際にモデルを作成する。

project_controller.rb

def new
    @project = Project.new
end

def create
    @project = Project.new(project_params)
    @project.save
    redirect_to projects_path
end

private
        # セキュリティ対策。projectとtitleだけ抽出する
    def project_params
        params[:project].permit(:title)
    end
フォームの書き方

new.html.erb

<h1>プロジェクトを追加する</h1>

<%= form_for @project do |f| %>
<p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
</p>

<p>
    <%= f.submit %>
</p>

<% end %>

end

form_for @project do |f| を使う。

フォームのvalidationを設定

モデルに対して設定する。
models/concern/project.rb

validates :title, presence: true

presence: true で空の値を受け付けないようにする。  

validateを通らなければ、新規追加画面に戻す
  def create
        @project = Project.new(project_params)
        if @project.save
            redirect_to projects_path
        else
            render 'new'
    end

@project.save はvalidateが失敗すると、falseを返す。

validateが通らなかった際のエラーメッセージを出す
<%= form_for @project do |f| %>

<p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
    <% if @project.errors.any? %>
    <hr>
    <%= @project.errors.inspect %>
    <hr>
    <%= @project.errors.messages[:title][0] %>
    <% end %>
</p>

@project.errors.inspect で詳しい情報が見れる。

エラーメッセージの変更 & validate項目の追加

models/project.rb

class Project < ActiveRecord::Base
    validates :title, 
    presence: {message:"値を入力して下さい。"},
    length: {minimum:3, message:"短すぎます。"}
end

長さなどの項目を追加していく。