実現したいこと
ユーザ編集画面からユーザ情報を更新したい。
発生している事象
ユーザ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メソッドに飛んだ際にどの項目も正常に更新されません。
ご助力いただけると幸いです。
足りない情報などあればご指摘ください。
editへ遷移するときのリンクなどはどのように記載されているのでしょうか?
routesではなくて、editのビューへ移動するリンクが貼られているビューです。もしかしたら、一つ前のリンクで飛ばしているんじゃないかと思ったので...
失礼しました。。。
更新ページの直前に該当する「マイページ」ビューを追記しました。
get '/edit_user', to: 'users#edit'
patch '/edit_user', to: 'users#update'
put '/edit_user', to: 'users#update'
:idがパスに割り振られていないです。多分、これによる影響な気がします。
モデルと紐づけた方が楽なので、例えばですがresourcesを使うのをお勧めします。
回答1件
あなたの回答
tips
プレビュー