実現したいこと
Railsで登録処理でのバリデーションエラー発生時に、
エラーメッセージを表示させたいです。
前提
現在、Railsで登録処理を作成しているのですが、
バリデーションエラー発生時にエラーメッセージが表示されません。
controllerのcreateメソッドで登録失敗時、
renderメソッドでnewのビューテンプレートを呼び出しているのですが、
view内のf.object.errors.any?
がfalseになっており、
controller内での@product
オブジェクトがviewに渡せていないようです。
また、ルーティングが以下のようになっており、
form_with
の引数にはモデルのインスタンスとURLを指定しています。
form_with
の引数がよくないのかなと思っているのですが、
いくつか方法を試してみましたがうまくいかず、ご教授願いたいです。
Helper | HTTP Verb | Path | Controller#Action |
---|---|---|---|
products_path | GET | /products(.:format) | products#index |
product_path | GET | /products/:id(.:format) | products#show |
admin_products_path | GET | /admin/products(.:format) | admin/products#index |
admin_products_path | POST | /admin/products(.:format) | admin/products#create |
new_admin_product_path | GET | /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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。