Ruby/Rails

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…

N+1問題の対応

N+1問題とは 主にインスタンスの配列に対して、ループ処理などによってその一つ一つに関連のあるデータを取得するときに、ループ処理の回数分クエリが走りパフォーマンスが低下すること。 @users = User.all @users.each do |user| puts user.post.content e…

コレクションルーティング(idを伴わないパス)

resources :articles do collection do get :bookmarks end end GET 'boards/bookmarks' というidを伴わないパスを認識し、リクエストをboardsコントローラのbookmarksアクションへルーティングする。

ブックマークを一回限りにするには?

scopeオプションで、一意性チェックの範囲を絞り込む属性を指定する。 class Bookmark < ApplicationRecord belongs_to :user belongs_to :article validates :user_id, uniqueness: { scope: :article_id } end 一つのarticle_idでレコードを絞り込み、その…

i18nにおけるアイテム渡し

アイテム渡しによって翻訳文を動的に変更でき、DRYにすることができる。 # comments_controller.rb def update if @comment.update(comment_params) redirect_to @comment, success: t('defaults.message.updated', item: Comment.model_name.human) else fl…

yieldとcontent_forでページタイトルを動的に変更する

yield ビューを挿入する場所を指定する コンテンツを名前付きのyieldとしてレンダリングするには、content_forメソッドを使用する。 content_for コンテンツを名前付きのyieldブロックとしてレイアウトに挿入する。ビュー内でコンテンツを定義したりレンダリ…

carrierwaveによる画像アップロード機能

画像アップロード インストール gem 'carrierwave' $ bundle install --path vendor/bundle アップローダの生成 $ rails generate uploader Icon アップローダファイル class IconUploader < CarrierWave::Uploader::Base include CarrierWave::MiniMagick #…

バリデーションエラーメッセージをビューで表示する

エラーメッセージのパーシャル(shared/_error_message.html.erb)にobjectとして@userを渡す <%= render 'shared/error_message', object: @user %> エラーメッセージのパーシャル object.errors.full_messageでエラーメッセージの全文が取得できる。 <% if…

タイムゾーン

config.time_zone アプリケーションのタイムゾーンを設定できる。 Time.currentやゲッターメソッドcreated_at,updated_atなどで取得できる時刻に反映される。 config.active_record.default_timezone DBへの読み書きをする際のタイムゾーンを、UTC(標準時)…

seedデータの作成

fakerをインストール gem 'faker' db/seed.rbの記述 今回はFaker::Artistで実在のアーティスト名を生成。 ほかにもFaker::ColorやFaker::Foodなど汎用性のあるものから、Faker::JapaneseMedia::StudioGhibliとかいうマニアックなものまで。 # 10人のartistと…

デコレータ

デコレータを導入することによって、ビューにロジックを書いたりモデルを肥大化させずに済む。 Helperとの違いは? Helper:モデルに依存しないビューロジックを書く Decorator:モデルに依存したビューロジックを書く インストール gem 'draper' デコレータ…

フラッシュメッセージ

Railsで用意されているflashオブジェクトはハッシュ形式で、メッセージタイプがキー、メッセージが値である。ビューでは以下の形で表示できる。 <% flash.each do |message_type, message| %> <div class="alert alert-<%= message_type %>"><%= message %></div> <% end %> add_flash_type add_flash_typesでBo…

rails-i18nによる国際化

rails-i18n 一般的なメッセージについての日本語での国際化設定ファイル(以下)を参照するようにできる。 rails-i18n/ja.yml at master · svenfuchs/rails-i18n · GitHub インストール gem 'rails-i18n' 設定 config/application.rb class Application < Ra…

モデルのバリデーションだけでなくデータベースでもカラム制約をかける理由

データベース側の制約がないと、SQLを実行したり、直接データを操作したときにモデルで禁止した不整合なデータができる可能性がある。 不整合なデータはアプリの不具合やエラーの原因となりかねないので、アプリケーションからモデルを経由してデータを作成…

sorcery

sorcery https://github.com/Sorcery/sorcery/wiki インストール gem 'sorcery' % bundle install Userモデルの自動生成 % rails generate sorcery:install # サブモジュールの指定 % rails generate sorcery:install remember_me reset_password コアメソッ…

require treeと@import

require_treeを使うと同ディレクトリのcssファイルをすべて読みこんでしまうため、ファイルを読み込む順番が分からなくなる。 // BAD //= require_tree . // GOOD @import 'foobar'; @importを使って必要なファイルのみ読み込む方がファイル管理を安全にでき…

ジェネレーターの設定

cofig/application.rb内でジェネレーターの設定が可能。 class Application < Rails::Application config.generators do |g| g.assets false # assets/stylesheetsのファイルを生成しない g.helper false # ヘルパーファイルを生成しない g.test_framework f…