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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1370閲覧

link_toメソッドで変数を渡して、アクションを実行させたい

taku-s

総合スコア12

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/10 09:30

編集2020/07/10 14:50

前提・実現したいこと

昨日質問をし、解決をしたのですが、再度エラーになってしまい困っております。
質問が2回目で、わかりにくくなっていたら申し訳ございません。

商品名を検索し、商品名をクリックすると、商品のレビューができるシステムを作っています。
しかし、クリックをするとエラーが出てしまいます。
(本日、ルーティングをネスト構造にしたところ再度エラーが出てしまいました)。
おそらく、link_toでviewで変数を渡せていないのだと思います。

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

NoMethodError in MessagesController#index undefined method `messages' for nil:NilClass

_item.html.haml(部分テンプの元はeach文で繰り返している)

.content .content__upper .content__upper-icon = icon('fas', 'user-alt', class: 'icon') .content__upper__right .content__upper__right-name = link_to item.name,item_messages_path(item.id), method: :get, class: 'search-name' .content__upper__right__element .content__upper__right__element-industry

messages_controller.rb

class MessagesController < ApplicationController def index @item = Item.find_by(id: params[:format]) @message = Message.new @messages = @item.messages.includes(:shop) end def create @item = Item.find_by(id: params[:format]) @message = @item.messages.new(message_params) if @message.save redirect_to messages_path(@item), else @messages = @item.messages.includes(:shop) render :index end end private def message_params params.require(:message).permit(:content).merge(shop_id: current_shop.id) end end

routes.rb

Rails.application.routes.draw do devise_for :shops root "shops#index" resources :shops resources :items, only: [:new, :create] do resources :messages collection do get 'search' end end end

ターミナルエラー文

Processing by MessagesController#index as HTML Parameters: {"authenticity_token"=>"VIK9b8gcffZ9HPDPXdKGxCjLo/LhETF5BsYixNCcu09h6TVbJ6pl2vYzHNFVmSS9O2fZ/1TNEYgv85DDkPQKAQ==", "item_id"=>"6"} Shop Load (0.3ms) SELECT `shops`.* FROM `shops` WHERE `shops`.`id` = 1 ORDER BY `shops`.`id` ASC LIMIT 1 Item Load (0.2ms) SELECT `items`.* FROM `items` WHERE `items`.`id` IS NULL LIMIT 1 ↳ app/controllers/messages_controller.rb:5:in `index'

試したこと

debuggerで、index controllerの中に@itemは入っているのか確認→nil
viewのlink_to以降の記述(item.id)が間違っているのではないかと思い、@item,
item.message,item:idなど記述をしてみましたが、それぞれエラー。
昨日の段階ではitem.idで問題なく商品レビューページへ飛べましたが、
routesをいじってitemとmessageをネストさせてからエラーが再度発生してしまいました。

補足情報(FW/ツールのバージョンなど)

ruby 2.6.5
ruby on rails 6.0.3.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

@item = Item.find_by(id: params[:format]の :format ってどこから来てます?ここは多分 :id
それでだめでしたら、indexを呼んだ時の log を見てください

投稿2020/07/10 12:57

winterboum

総合スコア23284

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

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

taku-s

2020/07/10 14:58

何度もご回答本当にありがとうございます。初めて開発をしていて、2日間のエラーで心が折れそうだったので返答いただけるだけで救われます。 :formatはネットで調べたものを記入していました、:idに修正したのですが同様のエラーになってしまいます。binding.pryでindexコントローラー内の至る所を確認したのですが、やはりnulになります。 ターミナルのエラー文も追加で貼り付けました。 ターミナルを見てみると、パラメーターの中にitem_id:6となっているので送ろうとはしているような気もするのですが、その後のItemLoadはnulになっています。これ以上考えが及ばず、もしご教授頂けるなら幸いです。
winterboum

2020/07/10 21:35

indexを呼んだ時の log を見てください
taku-s

2020/07/11 23:43

返答ありがとうございます。logの見方自体もわかっておらずターミナルに書いてある内容がlogだと思っておりました・・・申し訳ございません。 @item = Item.find(params[:item_id])と記述を変更したところ、無事解決できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問