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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

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

Ruby

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

Q&A

解決済

1回答

1186閲覧

【Rails5】ユーザ情報が正常に更新されない

zvub1123

総合スコア230

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2019/07/22 05:18

編集2019/07/22 06:11

実現したいこと

ユーザ編集画面からユーザ情報を更新したい。

発生している事象

ユーザID=2 のユーザでログインした状態でユーザ情報更新フォームにて編集を行い更新すると
ユーザID=1 のユーザが更新されてしまう。

ソースコード

erb

1#users/edit.html.erb 2 3<h1>ユーザ情報編集</h1> 4<div class="regist_form"> 5<%= form_with model: @user, local: true, :url => {:action => :update} do |f| %> 6 <div class="form-group"> 7 <h2><%= f.label "氏名" %> : <%= @user.user_name %></h2 class="form-control"> 8 </div> 9 <div class="form-group"> 10 <%= f.label "ユーザ名" %><br> 11 <%= f.text_field :display_name, class: 'form_control' %> 12 </div> 13 <div class="form-group"> 14 <%= f.label "メールアドレス" %><br> 15 <%= f.email_field :email, class: 'form_control' %> 16 </div> 17 <div class="form-group"> 18 <%= f.label "パスワード" %><br> 19 <%= f.password_field :password, class: 'form_control' %> 20 </div> 21 <div class="form-group"> 22 <%= f.label "パスワード(確認用)" %><br> 23 <%= f.password_field :password_confirmation, class: 'form_control' %> 24 </div> 25 <%= f.submit "Save changes", class: "btn btn-primary" %> 26<% end %> 27</div> 28

ruby

1#users_controller.rb 2 3class UsersController < ApplicationController 4 before_action :set_user, only: [:show, :edit, :update, :delete] 5 6 def show 7 # before_action :set_user でユーザ情報取得 8 end 9 10 def edit 11 # before_action :set_user でユーザ情報取得 12 end 13 14 def update 15 @user = User.find_by(params[:id]) 16 17 # if current_user = @user 18 if @user.update_attributes(user_params) 19 flash[:success] = 'successfully update user information.' 20 # params[:session][:display_name] = @user[:display_name] 21 redirect_to users_show_path(id: @user[:id]) 22 else 23 flash.now[:danger] = 'FAILED! Please check parameters.' 24 render 'edit' 25 end 26 # else 27 # redirect_to home_path 28 # end 29 end 30 31 private 32 def set_user 33 @user = User.find_by(display_name: params[:display_name]) 34 end 35 36 def user_params 37 params.require(:user).permit(:user_name, :display_name, :email, :password, :password_confirmation) 38 end 39end 40
class CreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| t.string :user_name t.string :display_name t.string :email t.string :password_digest t.timestamps end end end

追記

routes.rb は以下のようになっております。

Rails.application.routes.draw do <中略> get '/edit_user', to: 'users#edit' patch '/edit_user', to: 'users#update' put '/edit_user', to: 'users#update' <中略> end

また、edit.html.erb へ遷移するための、show.html.erb は以下の通りです。

<h1>マイページ</h1> <h3>氏名 : <%= @user.user_name %></h3> <h4>メールアドレス: <%= @user.email %></h4> <br> <% if logged_in? %> <%= link_to "ユーザ情報の変更", edit_user_path(display_name: @user.display_name), class: "btn btn-primary" %> <%= link_to 'ログアウト', logout_path, method: :delete %> <% end %>

編集画面からupdateメソッドに飛んだ際にどの項目も正常に更新されません。
ご助力いただけると幸いです。

足りない情報などあればご指摘ください。

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

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

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

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

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

bamboo-nova

2019/07/22 05:39

editへ遷移するときのリンクなどはどのように記載されているのでしょうか?
bamboo-nova

2019/07/22 06:06

routesではなくて、editのビューへ移動するリンクが貼られているビューです。もしかしたら、一つ前のリンクで飛ばしているんじゃないかと思ったので...
zvub1123

2019/07/22 06:11

失礼しました。。。 更新ページの直前に該当する「マイページ」ビューを追記しました。
bamboo-nova

2019/07/22 06:42

get '/edit_user', to: 'users#edit' patch '/edit_user', to: 'users#update' put '/edit_user', to: 'users#update' :idがパスに割り振られていないです。多分、これによる影響な気がします。 モデルと紐づけた方が楽なので、例えばですがresourcesを使うのをお勧めします。
guest

回答1

0

ベストアンサー

気になる点はいくつかあります。。
1)show.html.erb で表示しているUserがログインユーザで有るか否か保証がありません。
2)update では id でUser を取り出してますが、edit.html.erb には id のfieldがありません
3) update で if current_user = @user をコメントアウトしているのでログインユーザ以外のものも修正できます。
4) display_nameでUserを呼んでますが、 id で有る方が安全です。
5)routeが標準でないのが気になります。
resorces :users
の1行で index,show,create,update,destroy 等のrouteを定義し、かつ標準の形 例えば /users/1/edit を作ってくれます。特に理由がなければそれを使うことをお薦めします

####
書いていたつもりで落ちてました。
routesの修正の他にも修正必要です
update では User.find(params[:id]) と id を使うのに、
viewでは edit_user_path(display_name: @user.display_name) とIDを渡していません。
edit_user_path(@user) として下さい

投稿2019/07/22 07:47

編集2019/07/24 13:19
winterboum

総合スコア23347

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

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

zvub1123

2019/07/26 08:20

色々とご指摘ありがとうございます。 デフォルトのパスが見えるのが個人的に好きでは無かったのでパスを細かくカスタマイズしていたつもりだったのですが、それに付随してコントローラのアクションやViewで、統一感が損なわれてしまっていました。。。 ご指摘通りresources: <model> という表記に変え、対応する処理なども修正したところ可読性も上がりました。ご助力ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問