rails6.1.0
商品登録ページを「formオブジェクト」に変更しました。
変更後に、登録すると表題のエラーが出るようになってしまいました。
※変更前は正常に登録出来てました。
エラーメッセージ
NoMethodError in Items#create undefined method `fields' for nil:NilClass
問題の場所は、ビューのform_with、
@s3_direct_post.fieldsの部分でした。
app\views\items_form.html.erb
ruby
1<%= form_with model: @item, url: yield(:path), data: { 'form-data' => (@s3_direct_post.fields), 'url' => @s3_direct_post.url, 'host' => URI.parse(@s3_direct_post.url).host }, local: true, class: "item-form directUpload", multipart: false do |f| %> 2
この「@s3_direct_post」は、S3へアクセスするための認証情報を持ったものでコントローラからviewへ渡してます。
これは、newとeditでのみ利用します。
app\controllers\items_controller.rb
ruby
1class ItemsController < LoginController 2 before_action :set_s3_direct_post, only: [:new,:edit] 3 4 private 5 def set_s3_direct_post 6 @s3_direct_post = S3_BUCKET.presigned_post(key: "uploads/temp/#{SecureRandom.uuid}/${filename}", success_action_status: '201', acl: 'public-read') 7 end 8end
このような状態で登録をすると、登録すると表題のエラーになります。
formオブジェクト側に
@s3_direct_postのアクセサ?
何かを追加しなくてはいけないでしょうか?
formオブジェクトが初めてでよく分かりません。。。
先輩方アドバイスお願い致します。
formオブジェクト
app\form\item_image_form.rb
ruby
1 2class ItemImageForm 3 4 include ActiveModel::Model 5 6 attr_accessor :title, :description, :user_id, :category_id, :sub_category_id, 7 :prefecture1_id, :prefecture2_id, :prefecture3_id, :prefecture4_id, :prefecture5_id, 8 :paused, :skill_id, :src 9 10 validates :title, 11 presence: true, 12 length: {maximum: 40} 13 14 validates :description, 15 presence: true, 16 length: {maximum: 1000} 17 18 19 def category 20 #Category.find(category_id) 21 Category.find_by(category_id) 22 end 23 24 def user 25 user_id 26 end 27 28 29 30 def save 31 return false if invalid? 32 33 item = Item.create(title: title, description: description, user_id: user_id, category_id: category_id, sub_category_id: sub_category_id, 34 prefecture1_id: prefecture1_id, prefecture2_id: prefecture2_id, prefecture3_id: prefecture3_id, prefecture4_id: prefecture4_id, prefecture5_id: prefecture5_id, paused: paused, skill_id: skill_id 35 ) 36 item.images.build(src: src).save 37 38 39 end 40 41 42 43 44 45 46 47end 48 49 50
試したこと
nilにならないように?
before_action :set_s3_direct_postに:createを追加しました。
ruby
1before_action :set_s3_direct_post, only: [:new,:create, :edit]
そうするとエラーなく登録できまたが、登録後に登録ページに戻ってきちゃいまいした。
※そもそもcreate時にset_s3_direct_postは要らない・・・。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/16 00:10