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に処理が遷移して欲しい場合)
保存に失敗した時に、入力フォームに値が残っている流れ
createアクションで@userの保存に失敗(→DBへの保存は失敗しているが、ユーザー情報は残っている)
render :newで再度表示された時に、1の@userがviewに渡される
form_with model: @user の記述により、@userに入っている情報がテキストフィールドに表示される