質問するログイン新規登録
Ruby on Rails

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

544閲覧

Railsでバリデーションエラー発生時、 エラーメッセージが表示されない

Goo

総合スコア1

Ruby on Rails

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2023/08/05 04:43

0

0

実現したいこと

Railsで登録処理でのバリデーションエラー発生時に、
エラーメッセージを表示させたいです。

前提

現在、Railsで登録処理を作成しているのですが、
バリデーションエラー発生時にエラーメッセージが表示されません。

controllerのcreateメソッドで登録失敗時、
renderメソッドでnewのビューテンプレートを呼び出しているのですが、
view内のf.object.errors.any?がfalseになっており、
controller内での@productオブジェクトがviewに渡せていないようです。

また、ルーティングが以下のようになっており、
form_withの引数にはモデルのインスタンスとURLを指定しています。

form_withの引数がよくないのかなと思っているのですが、
いくつか方法を試してみましたがうまくいかず、ご教授願いたいです。

HelperHTTP VerbPathController#Action
products_pathGET/products(.:format)products#index
product_pathGET/products/:id(.:format)products#show
admin_products_pathGET/admin/products(.:format)admin/products#index
admin_products_pathPOST/admin/products(.:format)admin/products#create
new_admin_product_pathGET/admin/products/new(.:format)admin/products#new

該当のソースコード

app/controllers/admin/products_controller.rb

1class Admin::ProductsController < ApplicationController 2 ... 3 4 def new 5 @product = Product.new 6 end 7 8 def create 9 @product = Product.new(product_params) 10 if @product.save 11 redirect_to admin_products_path, notice: "商品「#{@product.name}」を登録しました。" 12 else 13 render :new 14 end 15 end 16 17 ... 18 private 19 def product_params 20 params.require(:product).permit(:name, :price, :description, :image) 21 end 22 ... 23end

app/views/admin/products/new.html.erb

1<div class="container"> 2 <h1>商品登録</h1> 3 4 <%= form_with model: @product, url: admin_products_path, local: true do |f| %> 5 <% if f.object.errors.any? %> 6 <div class="alert alert-danger"> 7 <ul class='error_explanation mb-0'> 8 <% f.object.errors.full_messages.each do |message| %> 9 <li><%= message %></li> 10 <% end %> 11 </ul> 12 </div> 13 <% end %> 14 15 <div class="form-group"> 16 <%= f.label :name %> 17 <%= f.text_field :name, class: 'form-control' %> 18 </div> 19 <div class="form-group"> 20 <%= f.label :price %> 21 <%= f.number_field :price, class: 'form-control' %> 22 </div> 23 <div class="form-group"> 24 <%= f.label :description %> 25 <%= f.text_area :description, rows: 5, class: 'form-control' %> 26 </div> 27 <div class="form-group"> 28 <%= f.label :image %> 29 <%= f.file_field :image, class: 'form-control' %> 30 </div> 31 <%= f.submit nil, class: 'btn btn-primary' %> 32 <% end %> 33</div>

app/models/product.rb

1class Product < ApplicationRecord 2 has_one_attached :image 3 4 validates :name, presence: true 5 validates :price, presence: true, numericality: { only_integer: true, greater_than: 0 } 6 validates :image, presence: true 7end

config/routes.rb

1Rails.application.routes.draw do 2 root 'products#index' 3 resources :products, only: %i[index show] 4 namespace :admin do 5 resources :products, only: %i[index new create edit update destroy] 6 end 7end

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

Rails:7.0.6

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

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

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

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

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

guest

回答1

0

自己解決

render :new, status: :unprocessable_entityとすることで対応できました。

投稿2023/08/05 08:59

Goo

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問