質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

2693閲覧

ユーザーの編集ができない原因を解決したい

yuu0000

総合スコア4

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/05/26 07:34

編集2021/05/26 07:41

ユーザーの編集ができるようにしたい

現在ユーザーのプロフィールの編集機能を作成しているのですが、編集画面に遷移しない原因と編集後にユーザーの情報がアップデートされない原因が掴めずにいます。

お忙しいところ大変恐縮ですが、解決に至るヒントや原因などをご教授願えますでしょうか、、

発生している問題・エラーメッセージ

エラーなどは表示されておりませんが、ユーザーの情報を更新すると情報がデータが変わらない状況です。

また、現在ログインしているユーザーのみが編集できるようにしており、他のユーザーのプロフィールを編集できないように制限をかけたところ、編集ページに遷移できないようになりました。

該当のソースコード

app/cotrollers/users_controller

controller

1class UsersController < ApplicationController 2 def show 3 @user = User.find(params[:id]) 4 end 5 6 def edit 7 @user = User.find(params[:id]) 8 if current_user.id != @user 9 redirect_to root_path 10 end 11 end 12 13 def update 14 @user = User.find(params[:id]) 15 if @user.valid? 16 @user.update(user_params) 17 redirect_to user_path(current_user.id) 18 else 19 render :edit 20 end 21 end 22 23 private 24 25 def user_params 26 params.require(:user).permit(:name, :profile, :avatar) 27 end 28end 29

app/views/users/show.html.erb

erb

1<%= render "shared/header" %> 2 3<div class="top-container"> 4 <div class="user-content"> 5 <div class="user-content__main"> 6 <div class="user-content__img"><%= image_tag @user.avatar, class: "user-img" %></div> 7 <div class="user-content__name"><%= @user.name %></div> 8 <div class="user-content__link"><%= link_to "プロフィール編集", edit_user_path(current_user.id), class: "user-link"%></div> 9 </div> 10 <div class="user-profile"> 11 <h2 class="user-profile__title">プロフィール</h2> 12 <div class="user-profile__name"><%= @user.profile %></div> 13 </div> 14 </div> 15 <div class="user-wrapper"> 16 <div class="user-wrapper__title"><%= "#{@user.name}さんのおすすめカフェ一覧" %></div> 17 <div class="table"> 18 <%= render partial: "shared/upload", collection: @user.uploads %> 19 </div> 20 </div> 21</div> 22

app/views/users/edit.html.erb

erb

1<%= render "shared/header" %> 2 3<div class="edit"> 4 <div class="edit__main"> 5 <div class="edit__left"> 6 <h2>Edit Profile</h2> 7 <h5>プロフィール編集画面</h5> 8 </div> 9 <div class="edit__right"> 10 <%= form_with model: current_user, url: user_path, local: true do |f| %> 11 <%#= render "devise/shared/error_messages", resource: resource %> 12 13 <div class="edit__field"> 14 <%= f.label :name %><br/> 15 <%= f.text_field :name, autofocus: true, autocomplete: "name" %> 16 </div> 17 18 <div class="edit__field"> 19 <%= f.label :profile %><br/> 20 <%= f.text_area :profile, autofocus: true, autocomplete: "profile",rows: "5", maxlength: "300" %> 21 </div> 22 23 <div class="edit__footer"> 24 <div class="edit__text"> 25 アイコン画像 26 </div> 27 <div class="edit__upload"> 28 <p> 29 Click to upload file 30 </p> 31 <%= f.file_field :avatar, id: "edit-image" %> 32 </div> 33 </div> 34 35 <div class="edit__actions"> 36 <%= f.submit "Edit Profile"%> 37 </div> 38 <% end %> 39 40 <%= link_to "Back", :back %> 41 42 </div> 43 </div> 44</div>

app/config/routes.rb

route

1Rails.application.routes.draw do 2 devise_for :users 3 get 'uploads/index' 4 root to: "uploads#index" 5 resources :uploads 6 resources :users, only: [:show, :edit, :update] 7end

app/models/user.rb

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 has_many :uploads 8 has_one_attached :avatar 9 with_options presence: true do 10 validates :email 11 validates :password, format: {with:/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "is invalid. Include both letters and numbers. Input half-width characters." } 12 validates :name 13 validates :profile, length: { maximum: 300} 14 validates :avatar 15 end 16end 17

試したこと

・コントローラーのeditupdate

def

1 @user = User.find(params[:id]) 2 if current_user.id != @user 3 redirect_to root_path 4 end 5 end

と記述して、条件分岐をするようにしたが、編集ページに遷移できないようになってしまった。
一度、条件分岐を切り離して、編集自体ができるか確認してみたところ、paramsの取得はできているが、データが更新されないことがわかった。

ruby

1 13: def update 2 14: @user = User.find(params[:id]) 3 => 15: binding.pry 4 16: if @user.update(user_params) 5 17: redirect_to user_path(current_user.id) 6 18: else 7 19: render :edit 8 20: end 9 21: end 10 11 params 12=> #<ActionController::Parameters {"_method"=>"patch", "authenticity_token"=>"nb5nlpahgaNruYVvgf52kxArsFN-rVosdXCCOG1uApeXw9cqlRvkhyD_PmCVuBj1iOqU28dn4-Hh5zrfm-Riag", "user"=>{"name"=>"yuu00", "profile"=>"カフェ巡りが", "avatar"=>#<ActionDispatch::Http::UploadedFile:0x00007f93289a8860 @tempfile=#<Tempfile:/var/folders/gw/k3mqyqh15y37h56g1b17ymvc0000gn/T/RackMultipart20210526-14898-uuwj6j.png>, @original_filename="初心者でも使用て開発ツール3選.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"user[avatar]\"; filename=\"\xE5\x88\x9D\xE5\xBF\x83\xE8\x80\x85\xE3\x81\xA6\xE3\x82\x99\xE3\x82\x82\xE4\xBD\xBF\xE7\x94\3\x81\xA6\xE3\x82\x99\xE3\x81\x8D\xE3\x82\x8B\xE3\x82\xA2\xE3\x83\x95\xE3\x82\x9A\xE3\x83\xAA\xE9\x96\x8B\xE7\x99\xBA\xE3\x83\x84\xE3\x83\xBC\xE3\x83\xAB3\xE9\x81\xB8.png\"\r\nContent-Type: image/png\r\n">}, "commit"=>"Edit Profile", "controller"=>"users", "action"=>"update", "id"=>"1"} permitted: false> 13

補足情報(FW/ツールのバージョンなど)

開発環境
・rubymine
・ruby(3.0.1)
・Ruby on rails (6.1.3.1)

参考文献
qiita
qiita

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

@user = User.find(params[:id])
if current_user.id != @user

current_user.idと比較するならば@user.idですね

deviseを用いている場合
@user.update(user_params)の代わりに@user.update_without_password(user_params)
(パスワードも更新する場合はupdate_with_password)
を使うことになります。

投稿2021/05/26 09:45

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuu0000

2021/05/26 09:48

ありがとうございます 下記のように修正したところ、条件分岐ができるようになりました! def edit @user = User.find(params[:id]) unless @user == current_user redirect_to user_path(@user) end end ユーザーの編集については挙動確認してみます!
yuu0000

2021/05/26 09:55

編集機能の挙動確認をしてみたところ、更新されず編集ページに遷移してしまいました、、 また、下記のように@userをcurrent_userと記述を変更してみても動作は同じでした。 挙動のイメージとしては、emaiとパスワードの編集とname、profile、avatarはプロフィール編集として分離させる実装です。 def update @user = User.find(params[:id]) if current_user.update_without_password(user_params) redirect_to user_path(current_user) else redirect_to edit_user_path(current_user) end end
asm

2021/05/26 10:06

passwordに自分でvalidate掛けている場合にはpasswordを検証する条件を付けないといけません。 if: :password_required? がちょうどいいと思いますが
yuu0000

2021/05/26 11:40

検証する条件の時は、users_controllerに下記のように記述する方法でしょうか? def password_required? #判定ロジック end
yuu0000

2021/05/26 12:58

ありがとうございます password_required?が記述されているファイルが見つけられないのですが、こちらの記述が書かれているファイルはどちらになるのでしょうか、、 初歩的な質問で申し訳ありません、、
asm

2021/05/26 15:33

devise gemの中のlib/devise/models/validatable.rbです
yuu0000

2021/05/27 04:29

bundle open でgemの中身を確認する方法でお間違いないでしょうか?
asm

2021/05/27 06:25

そうですね。 もう一度言いますが devise 略, :validatableしているので VlidatableはUserにインクルードしており、Userクラスにpassword_required?メソッドは存在する筈です
yuu0000

2021/05/27 07:19

そうですね、 userクラスの確認をしてみたのですが、password_required?メソッドが見当たりませんでした、 インクルード済みなので基本的には存在するメソッドですよね。 コードは下記のように表記されておりました。 class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :uploads has_one_attached :avatar with_options presence: true do validates :email validates :password, format: {with:/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "is invalid. Include both letters and numbers. Input half-width characters." } validates :name validates :profile, length: { maximum: 300} validates :avatar end end
asm

2021/05/27 07:46

Moduleをincludeしているわけですのでuser.rbにコードが存在している訳ではないです。
yuu0000

2021/05/27 07:49

そうなんですね、 失礼いたしました、 では、user.rbに password_required?メソッドを記述する方法で処理するんですね
asm

2021/05/27 07:53

コードは(user.rbに)存在してないけど、メソッドは(Userクラスに)存在している筈です。 別に記述してもいいけど、deviseの方のvalidateの条件に使ってるメソッドなので ヘタに上書きするとdeviseの方が壊れる可能性がありますね。
yuu0000

2021/05/27 07:56

既にdeviseのgemに記述されているメソッドなんですね、 私の認識の誤りでした、、
yuu0000

2021/05/27 08:05

コードを下記のように修正後、編集ができるようになりました。 allow_blank: trueを追加しました。 こちらのコードにした場合、別ページでemailとpasswordを変更する場合でも編集はできるのでしょうか? class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :uploads has_one_attached :avatar with_options presence: true do validates :email validates :password, format: {with:/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "is invalid. Include both letters and numbers. Input half-width characters." }, allow_blank: true validates :name validates :profile, length: { maximum: 300} validates :avatar end end
asm

2021/05/27 08:39

悪くないと思いますよ 必要な場面では別で空でないかがが検証されていますので
yuu0000

2021/05/27 10:35

かしこまりました! お忙しいところ誠にありがとうございました。 実装でご相談したい時に改めてよろしくお願いいたします!
guest

0

エラーメッセージを表示するようにすることを薦めます、
おそらく validates :password, format: .... としているので、パスワードがない というエラーでしょう。
if: パスワードがある をつけるか、allow_nil: true するかしましょう。

投稿2021/05/26 09:13

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuu0000

2021/05/26 09:21

ご連絡ありがとうございます! そうですね、可能性としてパスワードとemailなどは別のページで編集する実装にしておりますが、deviseでのユーザー登録のためプロフィール用の編集ページを作成しても、プロフィール情報もdevise管理になっているためにバリデーションがかかり更新ができない状態になっているみたいですね、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問