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

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…

Ajaxによるボタン表示の切り替え

Ajaxを使えば、Webページからサーバーに非同期で、ページを移動することなくリクエストを送信することができる。 ビュー remote: trueによってJavascriptによる変更が可能になる <%= form_with(model: ..., remote: true) do |f| %> ... <%= f.submit "Foll…

Active Storage

ファイルアップロード機能を提供。 インストール % rails active_storage:install % rails db:migrate 設定 # 開発環境 # config/environment/development.rb config.active_storage.service = :local # 本番環境 Amazon S3を使うときの例 # config/environm…

Procオブジェクト

Procオブジェクト メソッドのブロックを渡したオブジェクト。 callメソッドが呼ばれたときブロック内の処理を評価する。 proc_hi = -> { puts "hi" } proc_hi.call => "hi" # 引数を渡すとき proc_greeting = -> n{ puts n } proc_greeting.call("hi") => "h…

sendによるメソッドの抽象化

sendメソッド 渡されたオブジェクトに「メッセージを送る」ことによって、呼び出すメソッドを動的に決めることができる。 a = [1, 2, 3] a.length => 3 a.send(:length) => 3 a.send("length") => 3 xxx = 'length' a.send("#{xxx}") => 3 どれもオブジェク…

Action Mailer

メイラーの作成 メイラーは概念上コントローラと似通っており、メイラーを生成すると (コントローラと同様に) ビューのディレクトリとテストも同時に生成される。 % rails g mailer UserMailer account_activation UserメイラーとApplicationメイラーの編集 …