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

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

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

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

Ruby on Rails

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

Q&A

1回答

528閲覧

updateのバリデーションを機能させたい

hinata_hakumai

総合スコア3

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/11/04 17:48

前提・実現したいこと

投稿した住所を編集する機能を実装したいです。
現状、編集は可能なのですが空白でも編集が成立してしまいます。
空白で編集した際は、編集前の状態のままにする方法のご助言をよろしくお願い致します。

該当のソースコード

ruby

1models/map.rb 2 3class Map < ApplicationRecord 4 belongs_to :post 5 6 validates :address, presence: true 7end

ruby

1posts/edit.html.erb 2 3<div class="d-flex flex-column align-items-center mt-3 w-100"> 4 <div class="col-xl-7 col-lg-8 col-md-10 col-sm-11 post-card"> 5 <div class="card"> 6 <div class="post-body"> 7 <%= form_with model: @post, class: "upload-images p-0 border-0" do |f| %> 8 <div class="form-group"> 9 <label>住所</label> 10 <div> 11 <%= f.fields_for :map, @post.build_map do |m| %> 12 <%= m.text_field :address, class: "form-control", placeholder: "住所", name: "post[map_attributes][address]", id: "hidden_address" %> 13 <% end %> 14 </div> 15 <%= f.submit "編集する", class: "btn btn-primary" %> 16 <% end %> 17 </div> 18 </div> 19 </div> 20 </div> 21 </div>

ruby

1post_controller.rb 2 3 def edit 4 @post = Post.find_by(id: params[:id]) 5 end 6 7 def update 8 @post = Post.find(params[:id]) 9 if @post.update(post_params) 10 flash[:notice] = "投稿が保存されました" 11 redirect_to root_path 12 else 13 flash[:alert] = "投稿に失敗しました" 14 redirect_to edit_post_path(@post) 15 end 16 end

試したこと

https://teratail.com/questions/287522

ruby

1 def update 2 @post = Post.find(params[:id]) 3 if @post.map&.address.valid? 4 @post.update(post_params) 5 flash[:notice] = "投稿が保存されました" 6 redirect_to root_path 7 else 8 flash[:alert] = "投稿に失敗しました" 9 redirect_to edit_post_path(@post) 10 end 11 end

ruby

1 if @post.map&.address.present?

ruby

1 def update 2 @post = Post.find(params[:id]) 3 @post.update(post_params) 4 if @post.map&.address.valid? 5 flash[:notice] = "投稿が保存されました" 6 redirect_to root_path 7 else 8 flash[:alert] = "投稿に失敗しました" 9 redirect_to edit_post_path(@post) 10 end 11 end

上記を記事を参考に何度か試してみたのですが、アラートの"投稿に失敗しました"は表示されるもののアップデートが実行されてしまいます。アップデート前の状態のまま編集ページに戻るにはどうしたらいいでしょうか?

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

Rails 6.1.4.1
Mac OS
docker

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

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

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

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

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

guest

回答1

0

(住所が)「空白」とはどういう意味でしょうか?
もし、「空文字列」という意味であれば、おそらく、現状のコードで意図通りに動くと思うのですが。

以下、「空白」とは、「一つまたは複数の空白文字列」を意味していると仮定します。何が空白文字かは微妙な問題(たとえばいわゆる「全角空白」はどうなるか?)ですが、以下、UTF-8的な空白文字と仮定します。

validationに以下を加えてみてください。これでおそらく動くと思います。

ruby

1validates :address, format: { with: /[^[:space:]]/, message: "contains no significant characters" }

背景

validates_presence_of は、nilまたは空文字列(length=0)を許さない制限です。空白文字だけをも許さないためには、たとえば上のようなvalidationが必要。

投稿2021/11/04 20:27

MasaSakano

総合スコア188

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

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

hinata_hakumai

2021/11/05 02:07

ご回答ありがとうございます。 空白」の意味についてですが、仮定していただいた通り「一つまたは複数の空白文字列」という解釈で進めていきたいです。 validationに上記コードを追加したのですが、同様に"投稿に失敗しました"のアラートは表示されるものの、空白の場合でも更新されてしまいます。 空白の場合は、更新が行わずに以前の状態のまま編集画面に戻したいです。 お手数ですがご助言いただければと思います、、
MasaSakano

2021/11/08 10:42

"投稿に失敗しました"が本当に投稿時に表示されるならば、それは `if @post.update(post_params)` が(期待通りに)失敗している、つまりレコードは更新されていないはずです(実は元投稿のままでもそれは同じですね!)。何かかなり変なことが起こっている様子です。 Flashメッセージは本来とは異なるタイミングで表示されることはあり得ます。実際に該当の(空白)投稿をしたまさに時にelse節が確かに実行されているかどうか、ログを見ながら確認すると何かわかるかも知れません。必要ならば、その前後で該当レコードの内容をログに出力するようにするとデバッグの助けになるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問