【rails】プロフィールのフォームを作る

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

プロフィールの編集フォームを作る

前回までで、プロフィールページに自身の記事一覧も表示させることができた

今回はプロフィールの編集フォームを作る

フォームさえあれば、editnewとしても使える
(今回、newのviewなし)


エラーメッセージを表示させる

app/views/profile/edit.html.hamlを開く

  %ul
    - @profile.errors.full_messages.each do |message|
      %li= message
  1. articles/_form_html.hamlにすでにあるのでコピーしてくる
  2. articleを@profileに修正する

空のprofileを作る

app/controllers/profiles_controller.rbを開く

  def edit
    @profile = current_user.build_profile
  end

複数じゃなくて、ひとつしかないとき

→ current_user.build_モデル名(単数形)とする


フォームを作る

上記の続きでform_withを書き始める

  = form_with(model: @profile, url: profile_path,
  method: 'put',local: true) do |f|
    %div
      = f.label :nickname, 'ハンドルネーム'
    %div
      = f.text_field :nickname, class: 'text'
    %div
      = f.label :introduction, '自己紹介'
    %div
      = f.text_area :introduction

editしてupdateするので、putリクエストになる


セレクトボックスを作る

性別はセレクトボックスで選べるようにする

「男」「女」「男性」「female」など、文字列だと複数のパターンがうまれてしまう

models/profiles.rbを開く

gender:に対して「男性:0」「女性:1」「その他:2」を定義する

class Profile < ApplicationRecord
  enum gender: { male: 0, female: 1, other: 2 }

これにより、Profile.genders.keysで値が取れるようになる


app/views/profiles/edit.html.hamlに書き加える

    %div
      = f.label :gender, '性別'
    %div
      = f.select :gender, Profile.genders.keys

= f.select :gender, [ 'male', 'female', 'other' ]でも同じようにセレクトボックスに表示されるが、モデルの内容を変更したときに反映されない

Profile.genders.keysとしておくと都合が良い


セレクトボックスにクラスをつける

classを付けたいとき、第4引数にclass:を渡さないといけない

= f.select :gender, Profile.genders.keys, {}, { class: 'text' }
 #            1               2            3          4

セレクトボックスを作るとき、実際は↑のように引数になっている

4つ目の引数を作るために、3つ目に空の引数{}を渡す


フォームを完成させる

これまでの続きにフォームを書き足していく

    %div
      = f.label :birthday, '生年月日'
    %div
      = f.date_field :birthday , class: 'text'
    %div
      = f.label :subscribed, '通知を受け取る'
      = f.check_box :subscribed

    = f.submit '保存', class: 'btn-primary'

date_field(今回は生年月日)を入力するために、カレンダーがrailsで用意されている

#DAY23