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

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

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

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

Ruby on Rails 6

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

Ruby on Rails

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

Q&A

解決済

3回答

6117閲覧

railsのupdateでバリデーションが効かない

75ks

総合スコア4

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/26 06:01

前提・実現したいこと

rails 6.0.0 ruby 2.6.5
モデルで設定しているpresence: trueがupdateで効かない。

該当のソースコード

model

1class Post < ApplicationRecord 2 has_one_attached :image 3 4 with_options presence: true do 5 validates :text 6 validates :image 7 end 8end

controller

1class PostsController < ApplicationController 2 before_action :set_post, only: [:show, :destroy, :edit, :update] 3 4 ~~~省略~~~ 5 6 def edit 7 end 8 9 def update 10 if @post.valid? 11 @post.update(post_params) 12 flash[:notice] = "編集が完了しました" 13 redirect_to post_path(@post.id) 14 else 15 flash.now[:alert] = "編集に失敗しました" 16 render :edit 17 end 18 end 19 20 private 21 22 def post_params 23 params.require(:post).permit(:text, :image) 24 end 25 26 def set_post 27 @post = Post.find(params[:id]) 28 end 29end

試したこと

createアクションのsaveメソッドでも効いていない可能性があったので確認したが、空では登録できなくなっていてバリデーションが効いていた。

updateアクションでbinding.pryを実行して、paramsの中身を見たが空になっているのに@post.valid? => true
になっていた。

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

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

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

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

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

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

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

guest

回答3

0

@postには既存のpostが入っているわけで
validにならない方が問題かと思います

修正後の内容で正しいかと思いますが、
修正の結果バリデーションが効くようになったわけでなく
invalidのケースでも

flash[:notice] = "編集が完了しました" redirect_to post_path(@post.id)

の成功処理が行われていたことが問題です

投稿2020/08/26 06:29

naokit-dev

総合スコア424

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

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

0

ruby

1if @post.valid? 2 @post.update(post_params)

このvalid時点で@postには値が入っていませんか?
順番を変更すれば、バリデーションが効くような気がします。
よければお試しください。

ruby

1@post.update(post_params) 2if @post.valid?

投稿2020/08/26 06:24

Cojiro

総合スコア539

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

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

0

自己解決

updateアクションの、@post.valid?の部分を削除して、以下のように編集したら上手くバリデーションが効くようになりました。

ruby

1def update 2 if @post.update(post_params) 3 flash[:notice] = "編集が完了しました" 4 redirect_to post_path(@post.id) 5 else 6 flash.now[:alert] = "編集に失敗しました" 7 render :edit 8 end 9 end

投稿2020/08/26 06:20

75ks

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問