チワワかわいいブログ

RUNTEQでrails勉強する日々の記録

2020/12/29 sorcery

やったこと

form_with

ラベルタグを以下のように書いていたら

<%= f.label "First name" %>
<%= f.text_field :first_name, class: "form-control" %>

ブラウザでラベルをクリックしても入力フォームにカーソルが移動しない

<%= f.label :first_name, "First name" %>
<%= f.text_field :first_name, class: "form-control" %>

第一引数にカラム名を入れ忘れていたことで、正しく関連づけられていなかった
と思ったけど、

<%= f.label "first_name" %>

と書き直してもラベルのクリックでフォームに移動した
labelとtext_fieldの引数が違ったから反応しなかったと理解

sorcery

盛りだくさんで頭いっぱいになる
インストールすることで使えるようになるメソッドを確認

  • login
@user = login(params[:email], params[:password])

のように使う。
emailによるUser検索、パスワードの検証を行い、正常に処理できるとセッションデータにUserレコードの id値を格納する。

  • logged_in?
    現在ログイン中かtrue/falseで返す

  • redirect_back_or_to
    ログイン前にアクセスしようとしたURLがあればそこにリダイレクト、なければ指定のURLに返す

  • logout
    セッション情報を削除してログアウトする

  • require_login
    ログインしていないユーザーに対しnot_authenticatedアクションを実行する
    また、ここでアクセスしようとしたURLをセッションに格納しているため上述のredirect_back_or_toが使える
    before_actionにしてログイン必要なページで弾くことができるが、staticpagesコントローラにスキップの記載忘れててトップページが開けず詰まった

    リテラル記法

    Rubocopでのチェック

Use %i or %I for an array of symbols.

%記法を使えとのこと。
参考: shinmedia20.com
%記法のメリット→タイプ数が減る、可読性が増す

カラムにnull制約をたす

モデルのvalidationで設定した項目は、同じ制約をデータベースにも設定する必要がある
データベースにも制約をつけないと、モデルを通さず直接データ操作したときに不整合なデータができる可能性があり、不具合やエラーの原因となりかねないとのこと。 手順を確認。

rails generate migration add_null_false_to_users

#migration
  def change
    change_column_null :users, :last_name, null: false
    change_column_null :users, :first_name, null: false
  end

change_column_null :users, :last_name, null: false, 0
のように、第4引数を指定した場合はDBにすでにnullの項目があった場合に指定した引数に置き換えてくれる。(今回は割愛)
第4引数は既存のものを変更するだけで、デフォルト値を設定するわけではないので、デフォルト値も設定したい場合は以下のように同時に変更を加える必要がある

  def change
    change_column_null :users, :last_name, null: false, 0
    change_column :users, :first_name, :integer, default: 0
  end
form_withのオプション

基本的にはmodel:を使う
次のようの場合はurl:を使う

  • モデルとフォームが紐づかない場合(例: ログインフォーム: user_sessions)
  • createやupdateを行うコントローラがモデルと単純に紐づかない場合
    (例: model: @userと設定したが、members_controllerに処理が遷移して欲しい場合)

保存に失敗した時に、入力フォームに値が残っている流れ

  1. createアクションで@userの保存に失敗(→DBへの保存は失敗しているが、ユーザー情報は残っている)

  2. render :newで再度表示された時に、1の@userがviewに渡される

  3. form_with model: @user の記述により、@userに入っている情報がテキストフィールドに表示される