2021-09-01から1ヶ月間の記事一覧

select, map, collect

select コレクションのサブセット(部分集合)を取得する。select!では元のコレクションが改変される。 i = [1,2,3,4,5] i.select {|x| x % 2 == 0} # => [2, 4] map コレクションの各要素に操作を実行し、更新されたコレクションを取得する。map!では元のコ…

find, find_by, where 〜ActiveRecord::Relationとクエリインターフェース〜

find idを引数にとり、マッチした一件を返す 例外を起こす find_by キーと値を引数にとり、マッチした最初のレコードを返す nilを返す(find_by!は例外を起こす) where キーと値を引数にとり、マッチしたレコードのコレクション(ActiveRecord::Relationの…

Rubyの変数

インスタンス変数 クラス定義内で定義しない(するとクラスインスタンス変数になる) インスタンスに関連付けられる変数(インスタンスごとに独立した変数)なのでクラスメソッドからはアクセスできない あるインスタンスで属性値を変更しても、他のインスタ…

includeとextend

include インスタンスメソッドとしてアクセスできる。 クラスのインスタンスメソッドをモジュールで拡張する場合。 extend クラスメソッドとしてアクセスできる。 クラスメソッドなどの拡張だけが目的である場合 module Greetings def hello puts 'hello' en…

【Ruby】splat演算子

メソッドに渡される引数の数を事前に決めておきたくない場合に使う。可変長引数を取れるようにする。 def do_sth(*input) input.each {|x| puts x } end do_sth(3,4,5) # => 3 # => 4 # => 5 double splat演算子:キーバリューを引数にとる def do_sth(**inp…

【Ruby】yield

yield メソッドに渡されたブロックにアクセスする。 def puts_stuff puts 'first line' yield if block_given? puts 'third line' yield if block_given? end puts_stuff { puts 'its me' } # => first line # => its me # => third line # => its me

Rack

Rackとは アプリケーションサーバとRubyフレームワークをつなぐインターフェースを提供しているライブラリ。 Rack登場以前はアプリケーションサーバとフレームワークが密結合しており、組み合わせによってはデプロイ方法が複雑になってしまっていた。Rackの…

コールバック

オブジェクトのライフサイクルの中でメソッドを実行するフック。

count, length, size

count レコードの件数をカウントするSQLクエリを実行する。DBとメモリでレコード数が違う可能性がある場合に有用。 length メモリ上のコレクションに含まれるアイテムの件数を返す。データベーストランザクションを実行しない分、countより高速。 size lengt…

ActiveRecordマイグレーション

マイグレーションの概要 一つ一つのマイグレーションはデータベースの新しいバージョンとみなすことができる。スキーマは最初空の状態から始まり、マイグレーションによる変更が加わるたびにテーブル、カラム、エントリが追加される。マイグレーションの実行…

Service Object

ServiceObjectを導入するケース アクションが複雑になる場合 (決算期の終わりに帳簿をクローズする、など) アクションが複数のモデルにわたって動作する場合 (eコマースの購入でOrder, CreditCard, Customer を使用する、など) アクションから外部サービスと…

initializeメソッド

Rubyのオブジェクトをnewで生成する時、そのオブジェクトのinitializeメソッドが実行される。 class User # 初期値の設定などに使う def initialize(name, email, address) # 初期値 @name = name @email = email @address = address end end

content_tagによるHTMLタグの生成

HTMLとERBが混在する場合などに使用するとすっきり表現できる <%= content_tag (:i, nil, class: 'fa fa-youtube-play') %> <%= content_tag (:div, "Hello world!", class: "strong") %>

simple_formによるフォーム作成の簡略化

gem 'simple_form'で最低限の記述でフォームを作成できる。 gem 'simple_form' % bundle install % rails generate simple_form:install <%= simple_form_for @user do |f| %> <%= f.input :username, error: '半角英数字で' %> <%= f.input :email, placeho…

認可

ユーザーのロールによって使えるアクションを制限する。 pundit pundit: 各アクションがどのユーザーに認可されているかをポリシーファイルで管理する (cancancan: ユーザーごとにどのような権限を持っているかを管理する) gem "pundit" % bundle install % …

FormObjectを用いた検索機能

FormObject form_withのmodelオプションにActiveRecord以外のオブジェクトを渡す時(複数のモデルを扱うときなど)のデザインパターン。ActiveModelをインクルードすることで実現。 DBを使わないフォームでも、ActiveRecordを利用した場合と同じお作法を利用…

rakeタスクをcron実行する

cron: 定期的に何かのプログラムを実行するためのLinuxの機能。 既存のrakeタスクをcronで一定間隔で実行するため、gem 'whenever'を用いる。 whenever インストール gem 'whenever', require: false $ bundle install $ bundle exec wheneverize . # config…

rakeタスク

rake: rubyで処理内容を定義できるビルドツール。アプリを起動せずCUIから処理を行える。 rakeタスクの作成 rakeタスクのファイルを作成 $ rails g task student_grade lib/tasks配下に作成されたファイルにタスクを記述する。 # lib/tasks/student_grade.ra…

パンくず

gem 'gretel'でパンくずを実装する。 gretel gem 'gretel'をインストール。 gem "gretel" $ bundle install $ rails generate gretel:install パンくずの設定 設定ファイルconfig/bradcrumbs.rbに記述する。 # config/bradcrumbs.rb # 例 # crumb :クラム名 …

【RSpec】リクエストスペック~APIのテスト~

リクエストのテスト spec/requests配下にAPIのディレクトリをつくり、そこに各エンドポイントのファイルを作る。 # spec/requests/api/v1/articles_spec.rb RSpec.describe 'Api::V1::Articles', type: :request do describe 'GET /articles' do let(:articl…

【RSpec】ファクトリの作成

factoriesファイルを編集 以下のようにデフォルト値を設定する # spec/factories/students.rb FactoryBot.define do factory :student do sequence(:name) { |n| "Student#{n}" } sequence(:email) { |n| "student#{n}@test.com" } password { '12345678' } …

【RSpec】モデルスペック ~バリデーションのテスト~

バリデーションに関するテストを書く。 require 'rails_helper' RSpec.describe User, type: :model do it 'メールアドレスは必須項目であること' do user = build(:user) user.email = nil user.valid? expect(user.errors[:email]).to include("can't be b…

【RSpec】モジュールを読み込む

テスト全体の中で何回も繰り返し行われるような処理(ログインなど)はモジュールとして切り出すことでdryになる。 モジュール 'LoginMacros' を作成 ファイルはspec/support内に作る。 # spec/support/login_macros.rb module LoginMacros def login(user) …

【RSpec】セットアップ

RSpecのセットアップ 以下のgemを追加 group :development, :test do gem 'rspec-rails' gem 'factory_bot_rails' $ bundle install テストデータベースの追加 # config/database.yml # SQLite test: <

enumのプルダウン

f.selectとenumの組み合わせでプルダウンが作れる。 <%= f.select (:role, [[:general, 0],[:admin, 1]]) %> => <select name="role" id="role"> <option value="0">general</option> <option value="1">admin</option> </select> adminを選ぶと、params[:role] = 1が送られる。 ransack検索 + enum + i18n + プルダウン <%= f.select :role_eq, User.roles_…

enum

enumの定義 カラム(Integer型)に入る整数値と変数名を紐付ける(例:管理者権限)。 class User enum role: { general: 0, admin: 1 } enumを定義するとできること # インスタンスの値を変数名で取得 @user.role => "general" # インスタンスに変数名で値…

メールのプレビュー

メールのプレビューをブラウザで行う方法。 メイラーの設定 メイラーの設定については以下を参照。 phytoyasu.hatenablog.com letter_opener_web gem 'letter_opener_web'をインストール。 group :development do gem 'letter_opener_web' end % bundle inst…

gem 'config'による定数管理

gem 'config' で、環境ごとに異なる定数を管理する。 設定値をconfigフォルダ以下に一元管理すると、メンテナンスが楽になる。 gem 'config' $ rails g config:install インストールにより、以下のファイルが生成される。 config/initializers/config.rb con…

検索機能

ransackによる検索機能 gem 'ransack' % bundle install 検索結果を一覧表示するためのアクション # person_controller.rb def index @q = Person.ransack(params[:q]) # 送られてきたパラメータをもとにレコードを検索する @people = @q.result(distinct: t…

ページネーション

gem 'kaminari' によるページネーション gem 'kaminari' % bundle install % rails g kaminari:config コントローラ 対象となるページに相当するレコードを取得する。 1ページの件数が20、params[:page] = 3のとき、41~60番目のレコードが取得される def ind…