uot
@uot (uo yu)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

画像の有無によって条件を変更させたい

解決したいこと

下記のif文を作成したいです。
・投稿した画像があり→投稿した画像を表示させる
・投稿した画像が無し→用意した画像を表示させる

※そのため、投稿機能は画像がなくても登録できるようになっております。

上記の実装ができるような実装をご存じの方はご教示頂きたいです。

発生している問題・エラー

ArgumentError in Contents#index
Showing /Users/uot/projects/subscription/app/views/contents/index.html.erb where line #56 raised:

Can't resolve image into URL: to_model delegated to attachment, but attachment is nil

該当するソースコード

<% @content.each do |content| %>
  <% if content.image == nil %>
    <%= image_tag "haitatu.jpeg", class: "content-img" %>
       <% else %>
    <%= image_tag content.image, class: "content-img" %>
   <% end %>
<% end %>

コントローラー

 def index
    @content = Content.where(user: current_user).order("#{sort_column} #{sort_direction}")
  end

自分で試したこと

①下記のif文では別のエラー

<div>
  <% if !content.image.blank? %>
    <%= image_tag content.image, class: "content-img" %>
  <% else %>
   <%= image_tag "haitatu.jpeg", class: "content-img" %>
  <% end %>
</div>
<div>
  <% if content.image.present? %>
    <%= image_tag content.image, class: "content-img" %>
  <% else %>
   <%= image_tag "haitatu.jpeg", class: "content-img" %>
  <% end %>
</div>

↓同じエラー

NameError in Contents#index
Showing /Users/uot/projects/subscription/app/views/contents/index.html.erb where line #52 raised:

undefined local variable or method ` ' for #<#<Class:0x00007f85e07e0d98>:0x00007f85e0caadd8>
0

6Answer

Untitled-1_—subsystem__SSH__ubuntu.png

やっぱり入ってますね。全角スペースは半角スペースではないので、意味のあるものとして認識されます。なので、

undefined local variable or method ` ' <= 要は全角スペース

となります。

こういう全角スペースが視覚しやすいフォントを使うか、vscodeなら

こういう全角スペースをハイライトしてくれるようなextensionを入れたほうがいいかも。

コードのシンタックスハイライトもrubyではなくerbなので本来なら

```erb

<% if !content.image.blank? %>  <%= image_tag content.image, class: "content-img" %> <% else %> <%= image_tag "haitatu.jpeg", class: "content-img" %> <% end %>
\`\`\`

こうあれば、qiitaのハイライトがより的確なので全角スペースが赤い...で表示されるのがより分かりやすい。

<div>
  <% if !content.image.blank? %>
   <%= image_tag content.image, class: "content-img" %>
  <% else %>
  <%= image_tag "haitatu.jpeg", class: "content-img" %>
  <% end %>
</div>
1Like

@content = Content.where...なので、複数返ってくる事が想定されると思います。(Contentモデルの1レコードではなく複数)
なのでまずは@content@contentsの複数形にしたほうが後々混同しにくいと思う。

<% if content.image == nil %>

多分active storageを使っていると思いますが、そうならファイルが添付されているかどうかはattached?で確認すると思います。
has_one_attachedとか使っているならcontent.imageは添付有無に関わらず参照できるオブジェクトがありnilにはならない)

<% if !content.image.blank? %>

contentはActiveRecord_Relationのはずです(要はcontents、複数要素)。ActiveRecord_Relationにはimageというmethodはないはず。

0Like

@github0013@github さん

ご回答ありがとうございます!
複数形に関しましたは、実装後全て変更致します。ご指摘ありがとうございます!

今回のエラーに関してですが、
contentモデルにhas_one_attachedにimageを記述しております。

class Content < ApplicationRecord
  belongs_to :user
  has_one_attached :image

  validates :name, :price, presence: true
  validates :price,format: { with: /\A[0-9]+\z/ },
  numericality: { only_integer: true,greater_than: 0, less_than: 1000000}
  validates :name, length: { maximum: 20 }
end

また、下記のように修正しました。

 <% if content.image.attached? %>
      <%= image_tag content.image, class: "content-img" %>
  <% else %>
      <%= image_tag "haitatu.jpeg", class: "content-img" %>
  <% end %>

<% if !content.image.blank? %>と同じエラーが出てしまいました。
エラーが出てるような、メゾットは記述してないのですが、もしご存知のようでしたら再度ご教示頂きたいです。

NameError in Contents#index
Showing /Users/uot/projects/subscription/app/views/contents/index.html.erb where line #52 raised:

undefined local variable or method ` ' for #<#<Class:0x00007f92e9312c88>:0x00007f92e93111a8>
0Like

<% if !content.image.blank?%>

contentはActiveRecord_Relationのはずです

これは間違いでした。@contentとcontentと単数と複数と混乱していました。
content.imageはどういうオブジェクトかを一度確認してみてください。

$ rails c

> content = Content.find(...)
> content.image.class
> content.image.blank?
> content.image.present?
> content.image.attached?
> content.image.public_methods

そうすれば何をしようとしてなんでダメなのか分かると思います。

0Like

@github0013@github さん

原因は全角でした!
調べても出てこなかったので、良かったです。

zenkakuを入れてみようと思います!ありがとうございました!!

0Like

Your answer might help someone💌