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

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

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

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

Ruby

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

Q&A

解決済

1回答

2496閲覧

ActiveStorageで画像指定がない場合にfallbackさせる方法

tomomomo

総合スコア22

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2021/12/05 14:11

編集2021/12/06 02:55

実現したいこと

railsでツイッタークローンアプリを作っています。
activestorageをインストールし、プロフィール画像の変更や表示はうまくいっています。
新規登録した際に、まだ画像の変更をしていない段階ではno imageなどの固定された画像を表示させたいです。
イメージで言うとラインやツイッターで登録をしていない状態で表示される画像だと思っていただければと思います。

試したこと

下の該当コードでも記述しますが、if @user.image.attached?を記述することでひとまず画像を登録していない状態でもエラーは出なくなりました。
<%= image_tag %>の引数の最後にfallback: "no_image.jpg"を記述したところwrong number of arguments (given 1, expected 0)エラーが出て実現できませんでした。

該当コード

UserModel

1has_one_attached :image

UserShowHtml

1<%= image_tag @user.image, class:"border border-secondary rounded-circle border-0", size:"75x75" if @user.image.attached? %>

参考になりそうなものがなくこちらで質問させていただきました。
よろしくお願いいたします。

追記

下記コードで場合分けすることでエラー等は出なくなりました。

<% if @user.profile_image.attached? %> <%= image_tag @user.profile_image, class:"border border-secondary rounded-circle border-0", size:"75x75" if @user.profile_image.attached? %> <% else %> <%= image_tag "no_image.jpg" %> <% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

if @user.image.attached?を記述することでひとまず画像を登録していない状態でもエラーは出なくなりました。

そこにelseを付けて、ファイルがない場合の画像を表示させればいいのではないでしょうか?

投稿2021/12/05 22:52

maisumakun

総合スコア146571

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

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

tomomomo

2021/12/06 02:42

maisumakun様 ご回答いただきありがとうございます。 私もそう思い、 <% if @user.profile_image.attached? %> <%= image_tag @user.profile_image, class:"border border-secondary rounded-circle border-0", size:"75x75" if @user.profile_image.attached? %> <% else %>  <%= image_tag "no_image.jpg" %> <% end %> としたところ、表示自体はうまくいきました。 しかし画像を表示させるための箇所はuser以外にもpostモデルなどもあり多く存在します。 画像を表示させる毎にif文を書くのはどうなのかなと思っている状況です。 今回の場合は仕方ないのでしょうか? モデルなどで場合分けできないものかと考えていたのですが思いつかず。。。
maisumakun

2021/12/06 02:48

> モデルなどで場合分けできないものか 両者でスタイルが違うならビューで切り分けるほかありませんが、スタイルは同じで画像だけ違えればいいのであればモデルに振り分けメソッドを立てる方法もありです。 (すでに試していたのであれば、質問時点でその旨書いていただけると手戻りがありません)
tomomomo

2021/12/06 03:00

追記が遅れまして申し訳ありません。只今反映させました。 >スタイルは同じで画像だけ違えればいいのであればモデルに振り分けメソッドを立てる方法もありです。 具体的に画像関係の実装を下記します。 Userの場合 新規登録後にプロフィール編集から画像を任意のものに変更できる仕様です。 登録直後の初期設定に関してはno_image.jpgで統一したいと考えております。 Postの場合 投稿をする際に画像を添付するかは自由に設定できます。文字だけでも、画像つきでも投稿できるようにしたいです。 以上の点を含めましてメソッドを立てることは可能でしょうか。 また、大変恐縮ですがメソッドの定義の仕方につきましてもアドバイスいただけますでしょうか。
maisumakun

2021/12/06 03:07

単純に、User#profile_or_ermptyのようなメソッドを立てて、中で@user.profile_image.attached?の条件分岐をさせて適切なものを返せばいいだけです。
tomomomo

2021/12/06 03:23

かしこまりました。 やってみます。 回答いただきありがとうございました。
tomomomo

2021/12/06 03:49

何度もすみません。 >User#profile_or_ermptyのようなメソッドを立てて、中で@user.profile_image.attached?の条件分岐をさせて適切なものを返せばいいだけです。 これに関しては、viewファイルでわたしが条件分岐させたものと同じ意味のことをUser.rbで行えばいいということですよね? 適切なものというのが少しイメージが湧かず、すみません。
maisumakun

2021/12/06 04:30

> 適切なものというのが少しイメージが湧かず、すみません。 image_tagに渡す@user.profile_imageあるいは"no_image.jpg"を返す、というのが手っ取り早いです。
tomomomo

2021/12/06 04:40

def user_profile_or_empty if self.profile_image.attached? == false @user.profile_image = "no_image.jpg" end end attached?がfalseの場合のみにnoimageを設定したいのでこのような記述にしてみました。 view側で <% if @user.user_profile_or_empty %> <%= image_tag @user.profile_image, class:"border border-secondary rounded-circle border-0", size:"75x75" %> <% end %> としてみたのですが、画像が表示されなくなってしまいました。
maisumakun

2021/12/06 04:41 編集

> attached?がfalseの場合のみにnoimageを設定したいのでこのような記述にしてみました。 @user.profile_imageへの代入はせず、メソッド自体の返り値としてください。
tomomomo

2021/12/06 07:17

returnで処理を書くということですよね。 user_profile_or_emptyに引数など持たせるということですか? すみません、Rubyの処理にまだ慣れていなくて。
maisumakun

2021/12/06 07:36

> user_profile_or_emptyに引数など持たせるということですか? いえ、引数は不要です。
tomomomo

2021/12/06 07:51 編集

単純に return "no_image.jpg" ということですかね。
maisumakun

2021/12/06 07:59 編集

attached?がfalseの場合はそうなります。
tomomomo

2021/12/06 10:56

if @user.image.attached?をimage_tagに記述することで画像が紐づけられていなくてもエラーが起きないということが分かりました。 それを踏まえると今回の場合ではattached?がfalseの場合にのみ条件を適用する必要があると考えています。 trueの場合は画像を任意に変更した時に起きる挙動だと考えています。 考え方は合っていますでしょうか?
tomomomo

2021/12/06 11:09

modelは def user_profile_or_empty if self.profile_image.attached? == false return "no_image.jpg" end end viewは <% if @user.user_profile_or_empty %> <%= image_tag @user.profile_image, class:"border border-secondary rounded-circle border-0", size:"75x75" if @user.profile_image.attached? %> <% end %> としているのですが画像が表示されない状況です。 view側の表記が正しくないということでしょうか。
maisumakun

2021/12/06 11:09

> attached?がfalseの場合にのみ条件を適用する必要があると考えています。 ビューで毎回振り分けるのでなければ、「attached?がfalse」かどうかを判定するために条件分岐が必要です。
tomomomo

2021/12/06 11:24

>ビューで毎回振り分けるのでなければ、「attached?がfalse」かどうかを判定するために条件分岐が必要です。 すみません、私にはまだおっしゃっている意味がわかりません。 あと少しだけ詳しく教えていただけないでしょうか。
maisumakun

2021/12/06 11:25

> iew側の表記が正しくないということでしょうか。 ビューもモデルも正しくありません。 ・「ビューでの振り分けを避けたい」からuser_profile_or_emptyを作ったはずなのに、それを使ってビューでの振り分けを行っているのは、全く意図がわかりません(それで構わないなら、都度if-elseをかけばいいのです)。 ・メソッドにtrueの場合の返り値がありません。
tomomomo

2021/12/06 11:31

>全く意図がわかりません メソッドに関しまして、image_tagの中に仕込むことも可能ということでしょうか。 >メソッドにtrueの場合の返り値がありません。 trueになる時は任意の画像を選択して変更した際ですがそれをreturnとして与える方法があるのですか? すみません、やりたいこと自体は教えて頂いてイメージができているはずなのですがなかなかそれをコードに結びつけることができなく、お時間を頂戴してしまい申し訳ありません。
maisumakun

2021/12/06 11:32

> メソッドに関しまして、image_tagの中に仕込むことも可能ということでしょうか。 そうですね、image_tag @user.user_profile_or_emptyと使うことを念頭に置いたメソッドでした。 > それをreturnとして与える方法があるのですか? はい、単に@user.profile_imageを返せばいいだけです。
tomomomo

2021/12/06 11:45

modelを下記にしました(ifで==falseとしたのでelseがtrueと考えました) def user_profile_or_empty if self.profile_image.attached? == false return "no_image.jpg" else return @user.profile_image end end viewでは <%= image_tag @user.user_profile_or_empty, class:"border border-secondary rounded-circle border-0", size:"75x75" %> としたところ、modelでundefined method `profile_image' for nil:NilClassが出ました。 何か勘違い等してますでしょうか。
maisumakun

2021/12/06 11:46

return @user.profile_imageではなく、return profile_imageです。
tomomomo

2021/12/06 11:54

ありがとうございます。実装できました。。。 今回の実装に関しては今までの経験からの賜物かと存じますが、私にはこの答えが導き出せませんでした。 一つ一つの記述に対しての理解ができていない状況なのですが、rubyのメソッドに対しての知識が甘い故なのでしょうか。 postに対しても同じ処理をしたいので、今回教えて頂いたことを踏まえて実装したいと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問