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

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

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

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

Q&A

解決済

2回答

1550閲覧

[rails] idの取得をし、紐付けしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 6

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

1グッド

1クリップ

投稿2021/08/04 12:39

編集2021/08/12 10:41

ユーザーが投稿した記事(コーディネート全体)に、そのユーザーがアイテムを追加するページを作成したのですが
投稿した記事とアイテムページの紐付けがうまく行かず、undefined method `id' for nil:NilClass
が出てしまいます、、、

  • Postモデルのid
  • Itemモデルのpost_id

上記を紐付けしたいです。

発生している問題・エラーメッセージ

NoMethodError in ItemsController#create undefined method `id' for nil:NilClass Extracted source (around line #33): 31 @item = Item.new(item_image: params[:item_image], brand: params[:brand], size: params[:size], price: params[:price], 32 products_name: params[:products_name], post_id: params[:post_id]) 33 @item.post_id = "#{@post.id}" 34 @item.user_id="#{current_user.id}" 35 @item.save! 36 redirect_to("/items/#{@item.post_id}/show") Rails.root: /myapp Application Trace | Framework Trace | Full Trace app/controllers/items_controller.rb:33:in `create' Request Parameters: {"authenticity_token"=>"ODNkP4OO3pO9TtOXKvEDSeG/eOPDBlrpOS/1JeKHpryzOIaWBd1oSXMyyOHsmMO2HpSeW87E/GSmzzqwpRQVKQ==", "products_name"=>"テント", "brand"=>"snowpeak", "size"=>"M", "price"=>"300000"}

該当のソースコード

#####ItemsController

hrml

1class ItemsController < ApplicationController 2 def index 3 @user = current_user 4 @items = @user.items 5 end 6 7 def new 8 @item = Item.new 9 end 10 11 def create 12 @item = Item.new(item_image: params[:item_image], brand: params[:brand], size: params[:size], 13 price: params[:price], products_name: params[:products_name], post_id: params[:post_id]) 14 @item.post_id = "#{@post.id}" 15 @item.user_id="#{current_user.id}" 16 @item.save! 17 redirect_to("/items/#{@item.post_id}/show") 18 end 19 20 def show 21 @item = Item.find_by(id: params[:id]) 22 @post = Post.find_by(id: @item.post_id) 23 end 24end

イメージ説明

追記

イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明

shinoharat👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

dockerを再起動させましたら思い通りに動作いたしました。
お騒がせいたしました、、、

投稿2021/08/16 06:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

エラーメッセージのとおりです。@postが定義されていませんのでnilです。

投稿2021/08/04 22:36

maisumakun

総合スコア146018

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

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

退会済みユーザー

退会済みユーザー

2021/08/05 06:16

コメントありがとうございます。 @post = Post.find_by(id: params[:id])をcreateの中に記載したのですが同じようにNilになってしまいます、、、、
maisumakun

2021/08/05 08:17

そもそも論として、上のItem.createでpost_idを指定してしますので、さらに重ねて指定する必要があるのか自体が疑問です。
退会済みユーザー

退会済みユーザー

2021/08/11 08:31

ご回答ありがとうございます。 コントローラを修正し、下記のようにしました。 def new @post = Post.find(params[:post_id]) @item = Item.new end def create @item = Item.new(item_image: params[:item_image], brand: params[:brand], size: params[:size], price: params[:price], products_name: params[:products_name], post_id: params[:post_id]) @post = Post.find(params[:post_id]) @item.user_id = current_user.id if @item.save redirect_to("/items/#{@item.post_id}/show") else render("/items/new") end end そして、formでpost_idを飛ばしていなかったので <%= hidden_field_tag :post_id, @post.id %> 上記でとばしているのですが、 ActiveRecord::RecordNotFound in ItemsController#new Couldn't find Post without an ID とエラーがでてしまいます。 def newでの@postの定義が違うのでしょうか、?
maisumakun

2021/08/11 08:33

def newは「新規作成ページの表示」ですが、その際にparams[:post_id]はどのような形で与えられる、と考えていますか?
退会済みユーザー

退会済みユーザー

2021/08/11 08:52

コーディネート詳細画面のアイテム登録ボタンを押下し、アイテム登録フォームで<%= hidden_field_tag :post_id, @post.id %>としているので、コーディネート詳細のid(postのid)が与えられるのではないかと考えております。
maisumakun

2021/08/11 08:55

> コーディネート詳細画面のアイテム登録ボタンを押下し この部分はどのようなコードを書いていますか?
退会済みユーザー

退会済みユーザー

2021/08/11 09:19 編集

<%= link_to("アイテム登録をする", items_new_path(:post_id => @post.id)) %> このように記述しております。
maisumakun

2021/08/11 09:12 編集

確かに渡しているようですね。 (Couldn't find Post without an IDのエラーは、コントローラーの「@post = Post.find(params[:post_id])」に対して出ていますか?それとも、別な行に対して出ていますか?)
退会済みユーザー

退会済みユーザー

2021/08/11 09:28

サーバーを再起動したところ、エラーが変わり、 def newの@post = Post.find(params[:post_id])に ArgumentError in ItemsController#new When assigning attributes, you must pass a hash as an argument, String passed. とエラーが出るようになりました。 画像追加しております。
maisumakun

2021/08/11 09:31

エラーの内容とコードがマッチしていませんね…
shinoharat

2021/08/12 08:44

横から失礼します。 Post モデルのコードを見せていただけますか?
退会済みユーザー

退会済みユーザー

2021/08/12 10:41

shinoharat様 Post.rbのコードになります。(一応、画像も追加しました。) class Post < ApplicationRecord belongs_to :user has_many :items, inverse_of: :post, dependent: :destroy validates :user_id, {presence: true} mount_uploader :image, ImageUploader def user return User.find_by(id: self.user_id) end end
shinoharat

2021/08/12 13:35

うーん、、、現在 @post = Post.find(params[:post_id]) の部分で When assigning attributes, you must pass a hash as an argument, String passed. が発生しているとのことですが、通常 find メソッドでこのようなエラーが出るのは考えづらいです。 なので、モデル側に何か特殊なコードがあるのかと思ったのですが、見た感じ原因となるコードはなさそうですね。 お手数ですが、念の為 ApplicationRecord も見せてもらえませんか? -- ちなみに、エラーとは直接関係ないと思いますが、 def user return User.find_by(id: self.user_id) end の部分は不要です。「belongs_to :user」が同じ機能のメソッドを自動で定義してくれます。
退会済みユーザー

退会済みユーザー

2021/08/16 06:55

shinoharat様 dockerを再起動させましたら思い通りに動作いたしました。 お騒がせいたしました、、、 belongs_to :userの件、ご指摘ありがとうございます!! belongs_to、has_manyについてもう少し勉強したいとおもいます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問