【Rails】1対多のリレーションを作成
Zoneモデルを作成し、AreaモデルとZoneモデルを1対多のリレーションを作成します。
Zoneモデルの作成
bin/rails g scaffold Zone name:string description:text
Migration File
class CreateZones < ActiveRecord::Migration[6.0]
def change
create_table :zones do |t|
t.string :name, null: false, unique: true
t.text :description
t.timestamps
end
end
end
Migration
bin/rails db:migrate bundle exec annotate
1対多のRelation
bin/rails g migration add_area_ref_to_zones area:references
class AddAreaRefToZones < ActiveRecord::Migration[6.0]
def change
add_reference :zones, :area, foreign_key: true
end
end
bin/rails db:migrate bundle exec annotate
models/zone.rb
belongs_to :area
models/area.rb
has_many :zones
画像アップロード機能を追加(Active Storage)
ユーザモデルに画像を追加します。
bin/rails active_storage:install
マイグレーションファイルを確認
class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
def change
create_table :active_storage_blobs do |t|
t.string :key, null: false
t.string :filename, null: false
t.string :content_type
t.text :metadata
t.bigint :byte_size, null: false
t.string :checksum, null: false
t.datetime :created_at, null: false
t.index [ :key ], unique: true
end
create_table :active_storage_attachments do |t|
t.string :name, null: false
t.references :record, null: false, polymorphic: true, index: false
t.references :blob, null: false
t.datetime :created_at, null: false
t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
t.foreign_key :active_storage_blobs, column: :blob_id
end
end
end
マイグレーション
bin/rails db:migrate
config/environments/development.rb
# Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :local
config/storage.yml
# 何処に画像を保存するかの設定
Userモデルに画像を添付できるようにする
class User < ApplicationRecord has_one_attached :image end
User controllerの作成
bin/rails generate devise:controllers users
route.rb
Rails.application.routes.draw do
devise_for :users, controllers: {
registrations: 'users/registrations'
}
root to: 'areas#index'
resources :areas
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
app/controllers/users/registrations_controller.rb
# frozen_string_literal: true
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_sign_up_params, only: [:create]
before_action :configure_account_update_params, only: [:update]
# protected
# If you have extra params to permit, append them to the sanitizer.
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:image])
end
# If you have extra params to permit, append them to the sanitizer.
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [:image])
end
end
画面の設定
app/views/devise/registrations/new.html.slim app/views/devise/registrations/edit.html.slim
.field
= f.label :image
br
= f.file_field :image
Railsにユーザ認証機能を追加(devise)
install
# Flexible authentication solution for Rails with Warden. gem 'devise'
bundle install bin/rails g devise:install
config/initializers/devise.eb ・・・ Deviseの設定を行うファイル config/locals/devise.en.yml ・・・ Deviseのローカライゼーション用ファイル
config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
root urlを指定: config/routes.rb
root to: "home#index"
Flash Messageを追加: app/views/layouts/application.html.slim
p.notice= notice p.alert= alert
View Fileを作成
bin/rails g devise:views
secret_keyの発行?
bin/rails secret f63f6ce0e65208abe21abeaa8d3db687836e850771d740b9e21ce4fd7960b97b640be6c45d92d8d10b9c4f681a4e4a0717928035d42d671073f7682a920057b8
Deviseに紐付いたモデルの作成
bin/rails g devise user
Deviceの利用するモジュールを指定: app/models/user.rb
class User < ApplicationRecord
devise :database_authenticatable,
:registerable,
:recoverable,
:rememberable,
:validatable,
:confirmable,
:lockable,
:timeoutable,
:omniauthable
end
MigrationFileを変更:
# frozen_string_literal: true
class AddDeviseToUsers < ActiveRecord::Migration[6.0]
def self.up
change_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.inet :current_sign_in_ip
t.inet :last_sign_in_ip
# Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string :unconfirmed_email # Only if using reconfirmable
# Lockable
t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
t.string :unlock_token # Only if unlock strategy is :email or :both
t.datetime :locked_at
# Uncomment below if timestamps were not included in your original model.
# t.timestamps null: false
end
add_index :users, :email, unique: true
add_index :users, :reset_password_token, unique: true
add_index :users, :confirmation_token, unique: true
add_index :users, :unlock_token, unique: true
end
def self.down
# By default, we don't want to make any assumption about how to roll back a migration when your
# model already existed. Please edit below which fields you would like to remove in this migration.
raise ActiveRecord::IrreversibleMigration
end
end
Migration
bundle exec rails db:migrate
Annotate
bundle exec annotate
erbをslimに追加
bundle exec erb2slim app/views/devise/ --delete
RailsのER図を書き出すgem
rails-erdを利用するには Graphviz が必要です
http://graphviz.org/
sudo port install graphviz
Gem をインストール
group :development do # Generate Entity-Relationship Diagrams for Rails applications. Read more: http://voormedia.github.io/rails-erd/ gem "rails-erd" end
bundle install
ER図を作成
bundle exec erd
Git hooksの導入
git hooksはコミットやマージの前にスクリプトを走らす機能
Hooksの運用に便利なgem overcommitをインストールする
group :development do # A fully configurable and extendable Git hook manager # Read more: https://github.com/brigade/overcommit gem 'overcommit' end
bundle install bundle exec overcommit --install
設定
.overcommit.yml
PreCommit:
AuthorName:
enabled: false
Annotate:
enabled: ture
command: ['bundle', 'exec', 'annotate'] # Invoke within Bundler context
RuboCop:
enabled: ture
command: ['bundle', 'exec', 'rubocop']
設定変更を反映
bundle exec overcommit -s
現在の設定を確認
bundle exec overcommit -l
bundler の バージョンを指定する
Install可能なバージョンを指定
gem search ^bundler$ --all
バージョンを指定してインストール
gem install bundler -v 2.0.1
インストール済みのバージョン
gem list bundler
バージョンを指定して実行
bundle _2.0.1_ install
Rails app に Rubocopを導入する
Gemfile
group :development do # A Ruby static code analyzer and formatter, based on the community Ruby style guide. https://docs.rubocop.org gem 'rubocop', require: false end
bundle install
touch .rubocop.yml
AllCops: Rails: true Exclude: - bin/**/* - config/environments/**/* - config/initializers/**/* - config/application.rb - config/puma.rb - config/spring.rb - db/schema.rb - db/migrate/**/* - db/seeds.rb - lib/tasks/**/* - public/**/* - node_modules/**/* - vendor/**/* # "Missing top-level class documentation comment."を無効 Style/Documentation: Enabled: false LineLength: Max: 120
使い方
bundle exec rubocop
自動修正
bundle exec rubocop --auto-correct