6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2021年9月4日 現場Rails Chapter7 7-2一覧画面に検索機能を追加する

greater than or epual

_gteqと略して書けます。

登録日時を指定検索した時に出力されたSQL

SELECT DISTINCT "tasks".* FROM "tasks"
WHERE "tasks"."user_id" = $1 AND "tasks"."created_at" >= '2018-07-19 15:00:00'
ORDER BY "tasks"."created_at" DESC

tasksテーブルの中から登録日時が2018/7/19の15時よりも新しいtasksとuser_idのレコードを重複なく取り出して降順に並び替えます。

  • 上記にあいまい検索値も条件に加えた際の出力結果が以下になります。
SELECT DISTINCT "tasks".* FROM "tasks"
WHERE "tasks"."user_id" = $1 AND ("tasks"."name" ILIKE '%あいまい検索値%
AND "tasks"."created_at" >= '2018-07-19 15:00:00'
ORDER BY "tasks"."created_at" DESC

検索条件の受け取るパラメータを制限する

ransackでは例えば〇〇_contのようにカラム名を指定してキーを送るとransackメソッドにパラメータを渡せてしまうため、セキュリティ上の脆弱性に繋がります。 ストロングパラメータで制御することも可能ですが、検索条件は仕様変更するケースが発生しやすいため、ransackで提供されているメソッドを使ってモデル側で制御する実装が一般的です。

  # モデルファイル
  
  # デフォルトで全ての属性を許可しているので今回のケースではnameとcreated_atのみを受け取るパラメータを指定します。 
  def self.ransackable_attributes(auth_object = nil)
    %w[name created_at]
  end

  # 検索条件に含める関連を指定しています。このメソッドを空の配列を返すようにオーバーライドします。
  def self.ransackable_assosiations(auth_object = nil)
    []
  end

検索結果のカラム項目をいじって何が悪いんだろう?

↓ 例えば、男性と女性で検索出来る範囲を制限したい場合など?

なんらかの限定機能の場合など?

と推察しました。

ソートとは

複数のデータから成る列を、何らかの順序性に基いて順番通りになるよう並べ替えることです。

Ransackでは検索結果のソートを見出し部で操作できるようにするためのsort_linkヘルパーがあります。

7-4 メールを送る

Railsではメールを送るための機能として、Action Mailerという仕組みが用意されています。 Mailerの生成、ディレクトリ構成、基本的な役割はコントローラーとほとんど同じです。

メールを複数の相手に送信する
Railsガイド(2.3.3 メールを複数の相手に送信する)の引用

1つのメールを複数の相手に送信することももちろん可能です (サインアップが新規に行われたことを全管理者に通知するなど)。これを行なうには、メールのリストを:toキーに設定します。メールのリストの形式は、メールアドレスの配列でも、メールアドレスをカンマで区切った文字列でも構いません。

  class AdminMailer < ApplicationMailer
    default to: -> { ['user@example1.com', 'user@example2.com'] },
            from: 'notification@example.com'

    def new_registration(user)
      @user = user
      mail(subject: "New User Signup: #{@user.email}")
    end
  end

メイラーで定義したインスタンス変数などを以下のようにビューのテンプレートで使用することができます。

app/views/task_mailer/creation_email.html.slim

| 以下のタスクを作成しました

ul
  li
    | 名称:
    = @task.name
  li
    | 詳しい説明
    = simple_format(@task.description)

app/views/task_mailer/creation_email.text.slim

| 以下のタスクを作成しました
= "\n"
| 名称:
= @task.name
= "\n"
| 詳しい説明
= "\n"
= @task.description

メールをHTMLとTEXTに分けるのはなぜ?違いは?

  • HTML

Webページのように文字のフォントや色、大きさを変えることができたり

画像や動画を挿入することが出来るため、カスタマイズ性があります。

  • TEXT

HTMLを対応していないケースなど受信者の環境に配慮する場合など

メイラーのデータ制限、通信上の制限がある場合はTextが好ましいです。

参照

Action Mailer - Railsガイド
https://railsguides.jp/action_mailer_basics.html