🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Q&A

解決済

2回答

1153閲覧

Ruby on Rails5でのimgを使った画像表示について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

0グッド

1クリップ

投稿2019/12/15 15:38

Ruby on Rails5でのimgを使った画像表示について質問です。

シンプルな投稿サイトを作っている際に、ユーザー登録で画像も一緒に表示させようとしたのですが、上手くいきません。
画像は以下のディレクトリに保存しています。
public/user_images/default_user.jpg

それを下記2ページに表示させたいとします。
app/views/users/index.html.erb

Ruby

1<img src="<%= "/user_images/#{user.image_name}" %>">

app/views/users/show.html.erb

Ruby

1<img src="<%= "/user_images/#{@user.image_name}" %>">

コントローラーはこちらです
app/controllers/users_controller.rb

Ruby

1def create 2 @user = User.new(image_name: "default_user.jpg")

上記の例にて、show.html.erbでは「@user.image_name」でエラーが出ないのですが、index.html.erbでは「user.image_name」でないとエラーが出てしまいます。
私としてはどちらも@userが正解に見えるのですが...

すみませんが、なぜこのような違いが出るのか、ご存知の方ご教授お願いします。

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

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

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

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

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

bamboo-nova

2019/12/15 16:20

全体を見ていないので分かりませんが、indexのビューではeach doの構文が入っていて、 ``` <% @users.each do |user| %> ``` とか入れているパターンとかありませんか?
winterboum

2019/12/16 04:28

質問文から見て大体の予想はつくのですが、思い込みがあると嫌なのでcodeを追加してください。 今回は Userについての、indexとshowでの問題ですので、 users_controller.rb と users/index.html.*, users/show.html.* の3つ
guest

回答2

0

ベストアンサー

まだ未解決でしょうか?解決済でしたら読み飛ばしてください。
ソースが追加されるのを待ってるうちに忘れてました。ソースがないので、「多分こうなってるだろう」という予測で書きます。

まず、@userですが、「@userと書くと、必要なときに期待するデータが手に入る万能の召喚呪文」ではありません。使う前に予め必要な値を代入しておく必要があります。その意味では @userもuserも違いはありません。
違いは二つ。
userは、未定義で使うと Undefinedの例外で止まります。またそれが定義されたmethodの中でのみ有効です。
@userは未定義の場合 nil として扱われるます。またそのクラス(のそのインスタンス)の中ならどのmethodでも使えます。
加えてcontrollerで定義した時は「そのアクションで呼びだされた」viewでも使えます。

ですから @userが正しいのかuserが正しいのか、は「どちらに必要な値を代入してあるか」で決まります。

view show では controllerのshowで@user=User.find(params[:id])としていると思います。ですから @userが正解です。
view indexでは controllerのindexで @users=Usr.all の様に『複数形の』@usersに代入し、viewの方で @users.each do |user| としているとおもいます。@user は定義されておらず、user が定義されているので user が正解です。

投稿2019/12/18 23:38

winterboum

総合スコア23567

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

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

退会済みユーザー

退会済みユーザー

2019/12/20 13:07

返事が遅れてすみません。一旦全体を消して書き直したら上手くいってしまったので、自分で何が分からなかったのかが分からくなっていました。 winterboum様の回答を見ると、書き直したViewでは確かに@users.each do |user|としているので、この部分の不理解が原因だったのだと思います。@usersの各項目を1こずつ出すのだから@userで良さそうに見えなくもないですが、@usersと@userは全く別の変数なので、エラーになるだろうなと今では理解できます。 ご教授ありがとうございました。
guest

0

<img src="<%= "/user_images/#{@user.image_name}" %>">
の代わりに
<%= image_tag @user.image_name.url %>
にするとエラーが出ないはずです

投稿2019/12/16 11:19

k-810

総合スコア192

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問