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

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

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

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

Q&A

解決済

1回答

819閲覧

投稿のタイトルや説明文のバリデーション時にActiveStorageでエラー発生

husqy

総合スコア2

Ruby

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

0グッド

0クリップ

投稿2021/09/07 06:54

編集2021/09/08 01:23

お疲れさまです。
ActiveStorageで画像投稿(複数可)機能を実装しています。
投稿の空白や文字数に対するバリデーション実装で詰まっている部分があるので質問させてください。

やりたいこと

以下のエラーを解消したい

詰まっていること

更新時にtitleやdescription(テキスト)、座標の空欄や文字数オーバーのバリデーション機能を付けました。
その状態でeditページにて、「更新するボタン」を押すと以下のエラーが発生してしまいます。

NoMethodError in Roads#update Showing /var/www/app/app/views/roads/edit.html.erb where line #23 raised: undefined method `road_images' for nil:NilClass Extracted source (around line #23): </div> <% if @road.road_images.present? %> <p class="text-center">現在投稿されている画像(削除するものはチェックしてください)</p> <% @road.road_images.each do |image| %> <p class="d-flex justify-content-center">

試してみたこと

<%= raise @road.road_images.inspect %>で指摘の中身を表示すると、以下のように表示されました。
@name="road_images" となっているので問題ないように思えるのですが、何が違うのかわかりません。

#<ActiveStorage::Attached::Many:0x00007f4ba4804cf0 @name="road_images", @record=#<Road id: 10, user_id: 1, title: "test", description: "test", created_at: "2021-09-06 18:26:54.419859000 +0900", updated_at: "2021-09-07 15:37:52.720666000 +0900", latitude: nil, longitude: nil, likes_count: 0>>

ソースコード

Ruby

1 2# road_controller.rb 3 4class RoadsController < ApplicationController 5 PER_PAGE = 15 6 7 def index 8 @q = Road.ransack(params[:q]) 9 @roads = @q.result.includes(:user, :likes).page(params[:page]).per(PER_PAGE).order(:created_at) 10 end 11 12 def show 13 @road = Road.find(params[:id]) 14 @comments = @road.comments 15 @comment = Comment.new 16 end 17 18 def new 19 @road = Road.new 20 end 21 22 def create 23 @road = Road.new(road_params) 24 if @road.save 25 flash[:success] = "投稿が完了しました" 26 redirect_to roads_path 27 else 28 flash[:alert] = "投稿に失敗しました" 29 render :new 30 end 31 end 32 33 def edit 34 @road = Road.find(params[:id]) 35 end 36 37 def update 38 road = Road.find(params[:id]) 39 if params[:road][:road_image_ids] 40 params[:road][:road_image_ids].each do |road_image_id| 41 image = road.road_images.find(road_image_id) 42 image.purge 43 end 44 end 45 if road.update(road_params) 46 flash[:success] = "投稿を編集しました" 47 redirect_to roads_path 48 else 49 flash[:alert] = "更新に失敗しました" 50 render :edit 51 end 52 end 53 54 def destroy 55 Road.find(params[:id]).destroy 56 flash[:success] = "投稿を削除しました" 57 redirect_to roads_path 58 end 59 60 private 61 def road_params 62 params.require(:road).permit(:title, :description, :latitude, :longitude, :content, road_images: []).merge(user_id: current_user.id) 63 end 64end 65

Ruby

1 2# road.rb 3 4class Road < ApplicationRecord 5 has_many_attached :road_images 6 has_many :comments, dependent: :destroy 7 has_many :likes, dependent: :destroy 8 has_many :liked_users, through: :likes, source: :user 9 belongs_to :user 10 11 validates :latitude, :longitude, presence: true 12 validates :title, presence: true, length: { maximum: 50 } 13 validates :description, presence: true, length: { maximum: 400 } 14 15 def liked_by?(user) 16 likes.any?{ |like| like.user_id == user.id } 17 end 18end

ERB

1# edit.html.erb 2 3<div class="container py-5 mx-auto"> 4 <h3 class="text-center">編集</h3> 5 6 (略) 7 8 </div> 9 <%= raise @road.road_images.inspect %> 10 <% if @road.road_images.present? %> 11 <p class="text-center">現在投稿されている画像(削除するものはチェックしてください)</p> 12 <% @road.road_images.each do |image| %> 13 <p class="d-flex justify-content-center"> 14 <%= f.check_box :road_image_ids, {multiple: true}, image.id, false %> 15 <%= image_tag image, width: '300px', height: '200px' %> 16 </p> 17 <% end %> 18 <% end %> 19 20 <div class="text-center"> 21 <%= f.label :title, "タイトル" %> 22 <div class="text-center"> 23 <p><%= f.text_field :title, class: "title-field" %></p> 24 </div> 25 <%= f.label :description, "説明文" %> 26 <p><%= f.text_area :description, class: "description-field" %></p> 27 <%= f.submit '更新する', class: "btn btn-outline-primary submit-btn" %> 28 </div> 29 30 <% end %> 31</div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

NoMethodError in Roads#update Showing /var/www/app/app/views/roads/edit.html.erb
ということは、validationにかかってsaveできなかったときの動作だと思います。
controllerが載っていないのでエスパーモードですが、
else の方で @road を定義していないのでしょう。

raise での確認は、update ではなく edit のときのものでは?

投稿2021/09/07 22:52

編集2021/09/07 22:53
winterboum

総合スコア23567

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

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

husqy

2021/09/08 01:35

ありがとうございます! controller内のローカル変数をインスタンス変数にすることで解決できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問