This page looks best with JavaScript enabled
⚠️

『パーフェクトRuby on Rails』8章

 ·   ·  ☕ 3 分で読めます
✏️

8章

Active Storage

ActiveRecord::Type::Boolean.new.cast(remove_image)
Boolean型にする。

FALSE_VALUES = [ false, 0, “0”, :“0”, “f”, :f, “F”, :F, “false”, :false, “FALSE”, :FALSE, “off”, :off, “OFF”, :OFF, ].to_set.freeze
ActiveRecord::Type::Boolean

Active Storageにはバリデーション用ヘルパーがないので、Active Storage ValidationsというGemを使う。

@event.image.attached?@event.image.blob&.persisted?の違い

ダイレクトアップロードでは不完全なバリデーションしか掛けられないので、それを許容するか非同期でバリデーションを行う。

Searchkick

検索対象のレコード数が増える・文章検索ではインデックスが貼れない→Elasticsearchなどの全文検索エンジンを使用する。
ElasticsearchはRailsやDBとは別のプロセスで動き、インデックスやドキュメントのデータを内部で保持する。

Searchkick
DBとElasticsearchを連携させる処理を自動で行ってくれるGemの一つ。

本書ではフォームオブジェクトを用いて設定している。が、

  • form_withはデフォルトでajax通信を行う
  • TurbolinksはformによりajaxのGETリクエストに対応していない

\(^o^)/
ということで、jsを書く必要がある。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import Turbolinks from "turbolinks"

document.addEventListener("turbolinks:load", function(event) {
  const forms = document.querySelectorAll("form[method=get][data-remote=true]")
  for (const form of forms) {
    form.addEventListener("ajax:beforeSend", function(event) {
      const options = event.detail[1]
      Turbolinks.visit(options.url)
      event.preventDefault()
    })
  }
})

application.jsでrequireする。

エラーハンドリング

rescue_from
エラーを拾ってアクションに流す。下から判定される。

ルーティングエラーはRack Middlewareで発生するので、ルーティングでmatch "*path" => "application#error404", via: :allを設定して拾う。

前述のようにrescue_fromはRack Middlewareのエラーは拾えないので、エラーハンドリングを行うためのRack Middlewareを利用する。
Railsがデフォルトで提供しているRack Middlewareの一つであるActionDispatch::ShowExceptionsは例外をキャッチし、Rails.application.config.exceptions_appとして設定されたRackアプリケーションで処理される。デフォルトではActionController::PublicExceptionのインスタンスが設定される。

自作例外の発生時にpublic/500.html以外を表示する場合は、以下のように設定する。

1
2
3
4
5
6
7
module RailsApp
  class Application < Rails::Application
    config.action_dispatch.rescue_responses.merge!(
      "YourNewException" => :not_found
    )
  end
end

これで、YourNewException発生時にはpublic/404.htmlが表示される(本番環境のみ)。

エラー通知

exception_notificationは、Slackに大量にエラーが届いたり、誰が対応したか・特定のエラーのみ無視するといった細かい設定ができない。
→実務ではSentryやRollbarなどの外部サービスでエラーが管理するのを推奨。

Gem

Share on

END
END
@aiandrox

 
目次