###前提・実現したいこと
登録済みのユーザー情報編集機能を完成させたい
###具体的な説明
railsにてデートプラン支援的なwebサービスを作っていますが
ユーザー登録、マイページまで作成して
ユーザー情報の編集でつまずきました。
私の考えとしては
View側
・current_user情報をformに表示
・直接編集可能
・更新ボタンを押すとupdateメソッド
Controller側
・current_user と比較して
・送られてきたparams情報から不一致の部分を書き換え
・user.save
と言った感じなのですが、
実行して確認してみるとデータは送信されていますが、strong paramaterがfalseになってしまい
値が上手く入らず更新できません。
このやり方が不恰好なのは承知なのですが、うまいロジックが思いつかず、
こうするしかないと言ったところで躓いてしまいました。
初めてのサービス作りでつまずきの連続で困っています。
ご教授お願いいたします。
###発生している問題・エラーメッセージ
3] pry(#<UsersController>)> params => <ActionController::Parameters {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"HpRU+0OUBNsSgJH3uMS1fgTK/sKXRP1ypYWSJ/kA/oGK5EpndnZSxZ5h7rKqe4oxT7lqD+HI7 rnKeNqdhSbBZw==", "user"=>{"name"=>"test3", "email"=>"test3", "profile"=>"aaaa", "password"=>"222222", "password_confirmation"=>"222222"}, "commit"=>"登録", "contr oller"=>"users", "action"=>"update", "id"=>"4"} permitted: false>
###該当のソースコード
ruby 2.4.1p111
rails 5.1.4
Bootstrap (使い慣れていない)
『table Users』
create_table "users", force: :cascade do |t| t.string "name", null: false t.string "email", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "password_digest" t.text "profile" t.index ["email"], name: "uq_users_02", unique: true t.index ["name"], name: "uq_users_01", unique: true end
『model User』
class User < ApplicationRecord has_secure_password validates :name, presence: true, length: { maximum: 25 }, uniqueness: true validates :email, presence: true, uniqueness: true validates :password, presence: true, length: { in: 6..20 } validates :profile, length: { maximum: 140 } has_many :plans has_many :favorites has_many :reviews end
『controller』
class UsersController < ApplicationController def new @user = User.new end def create @user = User.new(user_params) if @user.save redirect_to users_path, notice: "登録が完了しました" else flash.now[:alert] = "登録に失敗しました" render :new end end def edit @user = current_user end def update @user = current_user @user.name = params[:name] @user.email = params[:email] binding.pry if @user.save flash[:notice] = "ユーザー情報を編集しました" redirect_to("/users/#{@user.id}") else render :edit end end private def user_params params.require(user).permit(:name, :email, :password, :password_confirmation) end end
『View』
<div class="users-edit-wrapper"> <div class="container"> <div class="row"> <div class="col-md-offset-7 col-md-4 users-edit-container"> <h1 class="text-center text-white login-title">edit</h1> <%= form_for @user do |f| %> <% @user.errors.full_messages.each do |user| %> <div class="form-error text-red"> <%= user %> </div> <% end %> <div class="form-group"> <%= f.label :name, "ユーザー名", class: "text-white"%> <%= f.text_field :name, class: "form-control"%> </div> <div class="form-group"> <%= f.label :email, "メールアドレス", class: "text-white"%> <%= f.text_field :email, class: "form-control"%> </div> <div class="form-group"> <%= f.label :profile, "プロフィール", class: "text-white"%> <%= f.text_area :profile, placeholder:"プロフィールを入力", size: "20x5", class: "form-control"%> </div> <div class="form-group"> <%= f.label :password, "現在のパスワード", class: "text-white"%> <%= f.password_field :password, class: "form-control"%> </div> <div class="form-group"> <%= f.label :password, "新しいパスワード", class: "text-white"%> <%= f.password_field :password, class: "form-control"%> </div> <div class="form-group"> <%= f.label :password_confirmation, "新しいパスワード(再入力)", class: "text-white"%> <%= f.password_field :password_confirmation, class: "form-control"%> </div> <%= f.submit "登録", class: "btn-block btn-white" %> <% end %> <%= link_to "パスワードを変更する", edit_user_path, class: "btn-login text-black" %> </div> </div> </div> </div>
###試したこと
passwordは別ページで編集するような考えも出たが、よくわからなくなってしまいやめました。。
###補足情報(言語/FW/ツール等のバージョンなど)
gem devise 4.3.0
gem becrypt 3.1.11
あなたの回答
tips
プレビュー