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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1761閲覧

formオブジェクトに変更したら「undefined method `fields' for nil:NilClass」のエラー

pecchan

総合スコア587

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/07/14 04:00

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は要らない・・・。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの発生箇所を勘違いしているのではないでしょうか。
createアクション内で@s3_direct_postを必要としている箇所があり、そこでエラーが発生していたんじゃないかと思います。
コードの全容が分かりませんが、記載の内容からするとbefore_actionにcreateを追加してエラーが解消したのはそのせいのように読み取れます。

エラーメッセージには正確な発生行が書かれていたはずなので、viewで起きているのかコントローラのアクションで起きているのか、判別できると思います。

投稿2021/07/14 07:19

oakbow

総合スコア227

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

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

pecchan

2021/07/16 00:10

全て仰る通りでした。 create時に@s3_direct_postは使っていないのですが、レンダリングで必要でした。 エラー自体は、コントローラで起きてました。 formオブジェクトが初めてで混乱しておりました。 有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問