プロフィールページでニックネーム、自己紹介文の編集機能をつける
routes.rb
resources :users, only: [:show, :new, :edit, :create, :destroy, :update]
users_contoroller
def update
@user = User.find(params[:id])
if @user.update(user_params)
flash[:notice] = "変更しました。"
redirect_to "/users/#{@user.id}/edit"
else
flash[:alert] = "失敗しました"
redirect_to "/users/#{@user.id}/edit"
end
end
private
def user_params
params.require(:user).permit(:nickname,:introduce)
end
edit.html.haml
.wrapper1.clearfix
= render 'mypage/mypage-sidemenu'
.profile-container
%h2.container__profile プロフィール
= form_for @user, url:"/users/#{@user.id}" , method: :patch, html:{class: "edit_form"} do |f|
.container__name
= image_tag "https://static.mercdn.net/images/member_photo_noimage_thumb.png", class: "image-tag"
= f.text_field :nickname, value: "#{@user.nickname}" ,class: "edit_name"
.container__text
= f.text_area :introduce, value: "#{@user.introduce}",class: "introduce", placeholder: "例)こんにちは☆ ご覧いただきありがとうございます!かわいいものやきれいめオフィスカジュアル中心に出品しています。服のサイズは主に9号です。気持ちよくお取引できるよう心がけていますので、商品や発送方法などご質問がありましたらお気軽にどうぞ♪"
.container__bottun
= f.submit "変更する", class: 'change-profile-form__action-btn'
form_withだとなぜかエラーになったので、form_forにしている。
上記のようにしたが、更新ができない。。
controllerにbinding.pryを挟み、@user.valid?→@user.errors.full_messagesをしたところ、パスワードが求められる。(コンソール上でcurrent_userでログイン状態であることは確認済)
#他のページ(ユーザー新規登録)でかけているvalidationが効いてしまっていた。
user.rb
# バリデーション
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
VALID_PHONE_REGEX = /\A\d{10}$|^\d{11}\z/
VALID_ADDRESS_NUMBER_REGEX = /\A[0-9]{3}-[0-9]{4}\z/
validates :nickname, presence: true, length: {maximum: 20}
validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX }
validates :password, presence: true, length: {minimum: 6, maximum: 128},on: :save_to_session_before_phone
validates :password_confirmation, presence: true, length: {minimum: 6, maximum: 128},on: :save_to_session_before_phone
validates :password, length: {minimum: 6, maximum: 128},on: :update,allow_blank: true
validates :password_confirmation, length: {minimum: 6, maximum: 128},on: :update,allow_blank: true
validates :last_name, presence: true
validates :first_name, presence: true
validates :last_name_kana, presence: true
validates :first_name_kana, presence: true
validates :birthdate_year, numericality: true
validates :birthdate_month, numericality: true
validates :birthdate_day, numericality: true
validates :phone_number, presence: true, uniqueness: true, format: { with: VALID_PHONE_REGEX }
validates :address_last_name, presence: true
validates :address_first_name, presence: true
validates :address_last_name_kana, presence: true
validates :address_first_name_kana, presence: true
validates :address_number, presence: true, format: { with: VALID_ADDRESS_NUMBER_REGEX }
validates :address_prefecture, presence: true
validates :address_name, presence: true
validates :address_block, presence: true
validates :address_phone_number, allow_blank: true, format: { with: VALID_PHONE_REGEX }
end
下記変更点。
user.rb
validates :password, presence: true, length: {minimum: 6, maximum: 128},on: :save_to_session_before_phone
validates :password_confirmation, presence: true, length: {minimum: 6, maximum: 128},on: :save_to_session_before_phone
validates :password, length: {minimum: 6, maximum: 128},on: :update,allow_blank: true
validates :password_confirmation, length: {minimum: 6, maximum: 128},on: :update,allow_blank: true
validationを増やし、on:アクション名で当該validationを使用するシーンを指定。
編集ページではallow_blankとすることで、空欄(未入力)で先に進めるようにしたら編集ができるようになった。