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

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

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

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

Q&A

解決済

1回答

446閲覧

fomオブジェクトを使用し複数リソースを同時登録したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/07/29 10:10

編集2021/07/29 12:34

やりたいこと:
fomオブジェクトを使用し複数リソースを同時登録する

下記サイトを参考に、accepts_nested_attributes_forを使わずにformオブジェクトを使用し
"参考サイト"
複数リソースを同時登録しようとしているのですが、下記エラーが出てしまい困っています。

uninitialized constantは「定義したクラスを読むことができない」ことを言っているとのことですが、
スペルミスなども注意して確認しましたが見当たりませんでした。。

この場合、app/forms/register_item_form.rbを読み込みに行っていると思っていたのですが違うのでしょうか?
また読み込ませたい場合はどのように記述したら良いのでしょうか、、?

ご回答よろしくお願い致します。

エラー内容

NameError in PostsController#new uninitialized constant PostsController::RegisterItemForm 16 @post_form = RegisterItemForm.new 17 18 end Rails.root: /myapp Application Trace | Framework Trace | Full Trace app/controllers/posts_controller.rb:16:in `new'

コントローラー・モデル・ビュー

html

1__PostsController__ 2 3class PostsController < ApplicationController 4 before_action :ensure_correct_user, {only: [:edit, :update, :destroy]} 5 6 def index 7 @posts = Post.all.order(created_at: :desc) 8 end 9 10 def show 11 @post = Post.find_by(id: params[:id]) 12 @user = @post.user 13 end 14 15 def new 16 #@post = Post.new 17 #@items=@post.items.build 18 @register_item_form = RegisterItemForm.new 19 20 end 21 22 def create 23 @register_item_form = RegisterItemForm.new(post_params) 24 if @register_item_form.save 25 redirect_to("/posts/#{@post.id}") 26 else 27 render("/posts/new") 28 end 29 end 30 31 def edit 32 @post = Post.find_by(id: params[:id]) 33 end 34 35 def update 36 @post = Post.find_by(id: params[:id]) 37 @post.image_title = params[:image_title] 38 @post.price = params[:price] 39 @post.image_photo="#{@post.id}.jpg" 40 image=params[:image_photo] 41 File.binwrite("app/assets/images/posts/#{@post.image_photo}", image.read) 42 if @post.save 43 redirect_to("/posts/#{@post.id}") 44 else 45 render("posts/#{@post.id}/edit") 46 end 47 end 48 49 def destroy 50 @post = Post.find_by(id: params[:id]) 51 @post.destroy 52 redirect_to("/") 53 end 54 55 def ensure_correct_user 56 @post = Post.find_by(id: params[:id]) 57 if @post.user_id != @current_user.id 58 flash[:notice] = "権限がありません" 59 redirect_to("/posts/index") 60 end 61 end 62 63 private 64 65 def post_params 66 #params.require(:post).permit(:image, :image_title, :description, items_attributes: [:id, :item_image, :products_name, :brand, :size, :price, :_destroy]) 67 params.require(:register_item_form).permit(:image, :image_title, :description, :item_image, :products_name, :brand, :size, :price, :_destroy) 68 end 69end

html

1__app/forms/register_item_form.rb__ 2 3class RegisterItemForm 4 include ActiveModel::Model 5 include ActiveModel::Attributes 6 7 # postカラム 8 attribute :description, :text 9 attribute :image_title, :text 10 attribute :image, :string 11 # itemカラム 12 attribute :item_image, :string 13 attribute :brand, :text 14 attribute :size, :string 15 attribute :price, :integer 16 attribute :products_name, :text 17 18 #ヴァリデーション 19 validates :user_id, {presence: true} 20 21 def save 22 #ヴァリデーションが通らないときにfalseを返す 23 return false unless valid? 24 25 #コーディネート登録 26 post = Post.new 27 post.save 28 29 #アイテム登録 30 item = post.item.build 31 item.save 32 33 end 34end

html

1__app/views/posts/new.html.erb__ 2 3<div class="main posts-new"> 4 <div class="container"> 5 <h1 class="form-heading">投稿画面</h1> 6 7 <%= form_with(model: @register_item_form, local: true) do |s| %> 8 9 <p>メイン写真(コーディネート写真)</p> 10 <label for="file_photo"> 11 <%= s.file_field :image %> 12 </label><br> 13 <div class="msr_text_05"> 14 <label>タイトル</label> 15 <%= s.text_field :image_title %><br> 16 </div> 17 <div class="msr_text_05"> 18 <label>説明</label> 19 <%= s.text_field :description %> 20 </div> 21 <div class="msr_file_05"> 22 <p>アイテム写真</p> 23 <label for="file_photo"> 24 画像を選択してください 25 <%= s.file_field :item_image %> 26 </label> 27 </div> 28 <div class="msr_text_05"> 29 <label>商品名</label> 30 <%= s.text_field :products_name %> 31 </div> 32 <div class="msr_text_05"> 33 <label>ブランド</label> 34 <%= s.text_field :brand %> 35 </div> 36 <div class="msr_text_05"> 37 <label>サイズ</label> 38 <%= s.text_field :size %> 39 </div> 40 <div class="msr_text_05"> 41 <label>価格</label> 42 <%= s.text_field :price %> 43 </div> 44 <div class="actions"> 45 <%= s.submit "投稿" %> 46 </div> 47 <% end %> 48 <br> 49 <%= link_to("トップページへ戻る", "/") %> 50 </div> 51</div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

実装方法変更のため解決済みにします。

投稿2021/08/04 12:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問