0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsチュートリアル備忘録 -モデル/ビュー/コントローラー(&ルーティング)編-

Last updated at Posted at 2020-04-24

rails作成

rails new アプリ名

コントローラー

コントローラの作成・消去

作成

rails g controller コントローラー名(複数形) アクション名
例 $ rails g controller StaticPages home help

消去

rails destroy controller コントローラー名(複数形) アクション名
例 $ rails generate controller StaticPages home help

postの制限

  def create
    @user = User.new(user_params)
    .
    .
    .
  end


  private
    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end

遷移

  • redirect_to : getリクエスト、ルートを経由しアクションを実行。そのためアクション内のインスタンス変数は使えない
  • render : ルートを経由せず、Viewを読みだす。そのためインスタンス変数を用いることができる。

redirect_toとrenderの違い

一時表示

redirect_to-flash

    flash[:success] = "Welcome to the Sample App!"
    redirect_to @user
(redirect_to @userは/User/:idにリダイレクト)

HTML

      <% flash.each do |message_type, message| %>
        <div class="alert alert-<%= message_type %>"><%= message %></div>
      <% end %>
message_type => success
message => Welcome to the Sample App!

render-flash.new

モデル

モデルの作成/消去

作成(マイグレーションの作成)

$ rails g model モデル名(単数形) カラム名:データ型
例:rails generate model User name:string email:string

db/migrateに生成される

消去

$ rails destroy model モデル名

データベース

マイグレーションの追加

rails generate migration マイグレーション名 追加事項
例 rails generate migration add_password_digest_to_users password_digest:string

マイグレーションの適用

$ rails db:migrate

消去

rails db:migrate:reset

マイグレーションの取り消し

$ rails db:rollbac

マイグレーションのバージョン指定で適用

$ rails db:migrate VERSION=0

パスワード

gemのインストール

gem 'bcrypt',         '3.1.12'
bundle install

パスワードの生成

app/models/user.rb
has_secure_password

パスワードの検証

user=User.find_by(***)
user && user.authenticate(params[:session][:password])
=> true 整合
=> false 不整合
User Password a && b
存在しない 何でもよい (nil && [オブジェクト]) == false
有効なユーザー 誤ったパスワード (true && false) == false
有効なユーザー 正しいパスワード (true && true) == true

オブジェクト

生成(new)

user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
=> #<User id: nil, name: "Michael Hartl", email: "mhartl@example.com",created_at: nil, updated_at: nil>

保存(save)

user.save
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.8ms)  INSERT INTO "users" ("name", "email", "created_at",
  "updated_at") VALUES (?, ?, ?, ?)  [["name", "Michael Hartl"],
  ["email", "mhartl@example.com"], ["created_at", 2016-05-23 19:05:58 UTC],
  ["updated_at", 2016-05-23 19:05:58 UTC]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> true

生成/保存の同時実行(create)

>> foo = User.create(name: "Foo", email: "foo@bar.com")
#<User id: 3, name: "Foo", email: "foo@bar.com", created_at: "2016-05-23 19:19:06", updated_at: "2016-05-23 19:19:06">

消去(destroy)

foo.destroy
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.2ms)  DELETE FROM "users" WHERE "users"."id" = ?  [["id", 3]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> #<User id: 3, name: "Foo", email: "foo@bar.com", created_at: "2016-05-23 19:19:06", updated_at: "2016-05-23 19:19:06">

検索

idでの検索(find)

User.find(id番号)
例 User.find(3)

特定の属性での検索(find_by)

User.find_by(email:"mhartl@example.com")
User.find_by(id:1)

すべてを返す(all)

User.all

エラー

内容(errors.full_messages)

>> user.errors.full_messages
=> ["Name can't be blank"]

存在(errors.any?)

>> user.errors.empty?
=> false

エラーの個数(errors.count)

>> user.errors.count
=> 2

更新

更新

>> user           # userオブジェクトが持つ情報のおさらい
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 19:05:58", updated_at: "2016-05-23 19:05:58">
>> user.email = "mhartl@example.net"
=> "mhartl@example.net"
>> user.save
=> true

更新/保存の同時実行(update_attributes)

>> user           # userオブジェクトが持つ情報のおさらい
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 19:05:58", updated_at: "2016-05-23 19:05:58">
>> user.update_attributes(name: "The Dude", email: "dude@abides.org")
=> true
>> user.name
=> "The Dude"
>> user.email
=> "dude@abides.org"

制約の設定

存在性

例 nameが空ではない

app/models/user.rb
validates :name, presence: true

長さ

app/models/user.rb
validates :name,  length: { maximum: 50 }

フォーマット(メールアドレスなど)

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, format:     { with: VALID_EMAIL_REGEX }

保存時

小文字指定

before_save { self.email = email.downcase }

一意性

大文字小文字を区別する

validates :email, uniqueness: true

大文字小文字を区別しない

validates :email,uniqueness: { case_sensitive: false }

データベースレベルでの一意性

特定のカラムにインデックスを付与し、その数値がデータベースレベルで一意であることを確認する

マイグレーション作成

rails generate migration マイグレーション名

マイグレーションファイルの編集(インデックス付与)

db/migrate/[timestamp]_マイグレーション名.rb
class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
  def change
    add_index :users, :email, unique: true
  end
end

マイグレート

$ rails db:migrate

サンプルデータの削除

test/fixtures/users.yml
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/
# FixtureSet.html

one:
  name: MyString
  email: MyString

two:
  name: MyString
  email: MyString

以上のコードの削除が必要

ビュー

レイアウトの共通化

ビューへの変数埋め込み

<% provide(:title, "Home") %>

共通

app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all',
                               'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application',
                               'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

ルーティング

root

root "コントローラ名#アクション名"
例 root "static_pages#home"

REST

config/routes.rb
resources :users
HTTPリクエスト URL アクション 名前付きルート 用途
GET /users index users_path すべてのユーザーを一覧するページ
GET /users/1 show user_path(user) 特定のユーザーを表示するページ
GET /users/new new new_user_path ユーザーを新規作成するページ (ユーザー登録)
POST /users create users_path ユーザーを作成するアクション
GET /users/1/edit edit edit_user_path(user) id=1のユーザーを編集するページ
PATCH /users/1 update user_path(user) ユーザーを更新するアクション
DELETE /users/1 destroy user_path(user) ユーザーを削除するアクション

その他

get "/名前" => "コントローラ名#アクション名"
post "/名前" => "コントローラ名#アクション名"

gemの更新

$ bundle install
$ bundle update

bundle installとbundle updateの違い

追加中

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?