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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1068閲覧

rails、Userの投稿のedit/updateができない

YukiTani

総合スコア19

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/01/16 06:35

編集2021/01/16 11:38

前提・実現したいこと

ユーザー情報の編集、updateができません。
エラー画面がなくどこが原因なのか特定に困っています。
コントローラーのupdateメソッドの条件分岐で毎回render :editを実行されてしまいます。
updateがfalseになってしまう原因がわかりません。

デパック

rails

1[1] pry(#<UsersController>)> params 2=> <ActionController::Parameters {"_method"=>"patch", "authenticity_token"=>"+KhzMcu9HQyw0VSFqTg08kxC6QJnsde9zIUnk09qLJpYathar8vtKRNB2qi8Nkzht8A1kttCTa0z1yY44ailtQ==", "user"=>{"name"=>"aaa", "email"=>"aa@gmail.com", "profile"=>"aaa", "profile_image"=>#<ActionDispatch::Http::UploadedFile:0x00007fda9b84ee50 @tempfile=#<Tempfile:/var/folders/cl/n5bbc7j97mv9y9bp0vxqfftw0000gn/T/RackMultipart20210116-94328-16jgiuj.png>, @original_filename="botanical.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"user[profile_image]\"; filename=\"botanical.png\"\r\nContent-Type: image/png\r\n">}, "commit"=>"更新", "controller"=>"users", "action"=>"update", "id"=>"2"} permitted: false> 3[2] pry(#<UsersController>)> @user = User.find(params[:id]) 4 User Load (18.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1 5 ↳ (pry):5:in `update' 6=> #<User id: 2, email: "aaa@gmail.com", name: "aaa", profile_image_id: nil, profile: nil, created_at: "2021-01-15 12:44:56", updated_at: "2021-01-15 12:44:56"> 7[3] pry(#<UsersController>)> @user.valid? 8=> false 9[4] pry(#<UsersController>)> @user.errors 10=> #<ActiveModel::Errors:0x00007fda93897018 11 @base=#<User id: 2, email: "aaa@gmail.com", name: "aaa", profile_image_id: nil, profile: nil, created_at: "2021-01-15 12:44:56", updated_at: "2021-01-15 12:44:56">, 12 @details={:password=>[{:error=>:invalid, :value=>nil}]}, 13 @messages={:password=>["英字と数字の両方を含めて設定してください"]}> 14[5] pry(#<UsersController>)> exit 15

イメージ説明
仮説、updateメソッドは、元となる何かがあることが前提で、現状profile.imageなどがNULLだから、updateできなんでしょうか?

該当のソースコード (Userコントローラー)

rails

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

rails

1 <%= form_with model: @user, local: true do |f| %> 2 <div class="field"> 3 <%= f.label :name, "ユーザー名", class: "label" %> 4 <%= f.text_field :name, class: "input" %> 5 </div> 6 7 <div class="field"> 8 <%= f.label :email, "メールアドレス", class: "label" %> 9 <%= f.email_field :email, class: "input" %> 10 </div> 11 12 <div class="field"> 13 <%= f.label :profile, "プロフィール", class: "label" %> 14 <%= f.text_area :profile, class: "textarea" %> 15 </div> 16 17 <div class="field"> 18 <%= f.label :profile_image, "プロフィール画像", class: "label" %> 19 <%= f.attachment_field :profile_image, class: "input" %> 20 </div> 21 22 <%= f.submit "更新", class: "button is-success" %> 23 <% end %> 24 25

(Userモデル)

rails

1 2class User < ApplicationRecord 3 # Include default devise modules. Others available are: 4 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 5 devise :database_authenticatable, :registerable, 6 :recoverable, :rememberable, :validatable 7 8 PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze 9 validates_format_of :password, with: PASSWORD_REGEX, message: '英字と数字の両方を含めて設定してください', on: :create  10 11 validates :name, presence: true 12 13 has_many :posts 14 has_many :comments 15 attachment :profile_image 16end 17

試したこと、

###やりたいこと
テスト環境です。
サインイン画面では、email,name,passwordだけの登録し、その後ユーザー詳細から編集と画像の追加
ができるようにしたいと思っています。しかしながら、現状フォームを入力して更新ボタンを押しても、dbに保存されるどころか、falseで返され、editのページに戻されてしまします。

さまざまなサイトで、refile導入時のエラーなど、探してみましたが前例がなく、答えが導けず困っています。

初学者ながら、画像を投稿できるウェブアプリケーションを作りたいと思い作っています。
どうぞアドバイス宜しくお願いします。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

winterboum

2021/01/16 08:10

タイトル直しましょう。「Userの」ですね。 model user のcode載せてください
YukiTani

2021/01/16 09:45 編集

ご指摘ありがとうごいます。追記しました。 現在userモデルとpostモデルを作成しています
guest

回答1

0

ベストアンサー

passwordのvalidationが常にかかっています。
新規登録の時だけに必要なのでは?

on: :create option を追加してください

そだ、devise の設定で , :validatable があるとそれ効かないかも。
その場合は , :validatable を消し、必要なvalidationを自分で書いてください

投稿2021/01/16 11:09

winterboum

総合スコア23347

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

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

YukiTani

2021/01/16 11:42

今回は、:validatableを削除することなく、on :createを使うことで、User情報がedit, updateができるようになりました。 バリデーションのオプションのことを調べたら、まだまだ知らない事ばかりだったので学習意欲が増しました。昨日からずっと悩んでいたことだったので、本当に嬉しいです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問