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

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

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

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

Q&A

解決済

2回答

174閲覧

Railsでのparamsの取り扱いについて

tttkkm

総合スコア10

Ruby on Rails

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

0グッド

0クリップ

投稿2020/02/24 12:49

編集2020/02/24 12:56

#前提・実現したいこと
ProgateでRailsの学習をしております。postsデータベースからデータを取り出して表示するために、コントローラーの中で@postにデータを代入しました。更にルーティングで:idを設定し、パラメータを受け取れるようにし、それを@idに代入しました。

htmlの方でそれを取り出そうと思い、下記のようなコードを書いてみましたが、エラーになりました。アクセスしたurlは/posts/0です。
試しに、@idの部分を@post[0]で書くと正常に動作しました。

#発生している問題
下記のようなメッセージがブラウザに表示されました。

TypeError in Posts#show

@idが0と同じなら、@idでも同様の結果が出るはずだと考えたのですが、何が違うのでしょうか?

#該当のソースコード

rb

1get "posts/:id" =>"posts#show"

rb

1 def show 2 @post =Post.all 3 @id =params[:id] 4 end

html

1 <%=@post[@id].content%>

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

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

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

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

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

fumiya0414

2020/02/24 13:27

showのビューにデータを表示させたいのであればコントローラーの記述は@post=Post.allではなく、@posts=Post.find(params[:id])ではないでしょうか?そして@idは渡す必要がない気がします。 そしてビュー(html)側では.each で回して変数postに代入し、post.contentで取り出すべきでないですか?
tttkkm

2020/02/24 13:38

正解はそうだったのですが、もっと単純にできないのかなと思いやってみました。そしてなぜできないのかがわからなかったので質問させていただきました。
guest

回答2

0

ベストアンサー

@idが0と同じなら、@idでも同様の結果が出るはずだと考えたのですが、何が違うのでしょうか?

idcontent
01つ目の投稿

この場合、確かにPost.all[id]Post.find(id)の結果は同じになります。

が、Post.allで取得したレコードの配列が必ずID順であるという保証はなく、
データが作成されたり削除されたりしていく中で毎回レコードの位置とIDが一致するとは限らないため、
Post.all[id]で目的のレコードが取得できるとは限りません。
ここが一番大きな違いになると思います。

erb

1<%=@post[@id].content%>

のエラーについてですが、clora さんの回答通り@idが文字列(String型)だから起きています。
配列(今回の場合はActiveRecord_Relationですが)のindex指定は必ず整数(Integer型)でなければいけません。

投稿2020/02/25 01:52

Mugheart

総合スコア2349

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

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

tttkkm

2020/02/25 03:09

なぜPost.find(id)を使うのかがわからなかったんですが、そういう理由だったんですね!ありがとうございます!ベストアンサーにさせていただきます!
guest

0

@id =params[:id]がstring型だからだと思います。
@id.to_iとしてint型に変換してあげるとできると思います。

ただ、fumiya0414さんが言っているように、showではコントローラで@post=Post.find(params[:id])として、ビューでは、@post.contentと記述した方が一般的です。

投稿2020/02/24 16:31

編集2020/02/24 16:32
clora

総合スコア72

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

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

tttkkm

2020/02/25 03:08

なるほど!string型だからだったんですね!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問