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

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

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

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

Ruby

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

Q&A

解決済

2回答

779閲覧

Rails,エラーundefined method `picture?' for nil:NilClass の解決がわからない

KawdaSyouhei

総合スコア15

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2018/10/16 10:01

前提・実現したいこと

現在railsを使って画像投稿機能を製作中です。こちらのサイト(https://workabroad.jp/tech/1118)を参考にしながら政策をしています。
placesというテーブルに:pictureというカラムをつけていて、そこに画像のデータを入れています。

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

NoMethodError in Places#index undefined method `picture?' for nil:NilClass

該当のソースコード

<% if @places.picture? %>のところにundefined method `picture?' for nil:NilClassというエラーが出ます。

view

1<% if @places.picture? %> 2  <%= image_tag @place.picture.thumb.url %> 3<% end %> 4

controller

1def index 2 @places = Place.all 3end 4 5def new 6 @place = Place.new 7 end 8 9 def create 10 @place = Place.new(place_params) 11 if @place.save 12 redirect_to root_path 13 end 14 end 15 16 private 17 18 def place_params 19 params.require(:place).permit(:name, :latitude, :longitude, :comment, :picture) 20 end 21end

model

1class Place < ApplicationRecord 2 mount_uploader :picture, PictureUploader 3end 4

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

初心者なので、他の優秀な方々のような良い回答をできるかどうかはわかりませんが…。

このエラーの原因は『配列に対して、カラムの存在を確認するための処理をしようとしている』ことだと思われます。
*私もハマった記憶があります…。

@places = Place.all を行うことによってPlaseテーブルのカラムが全て配列の形で取り出されます。
そして、@placesという配列の形では、pictureという要素は存在していません。
本件の場合、pictureとは、@placesの配列の各要素を構成するカラムの一つです。
ですから、if @places.first.picture?とすれば、とりあえずエラーは出なくなると思います。

妄想ですが、KawdaSyouheiさんが行いたい処理をサンプルコードにするとこんな感じかな、と思ったので、参考までに記述させていただきます。

view

1<% @places.each do |place| %> 2 <% if place.picture? %> 3 <!--上記の記述ですが、私は if place.picture.present? とかをよく使ってます。--> 4  <%= image_tag @place.picture.thumb.url %> 5 <% end %> 6<% end %>

末筆ですが、データがどのような形で取り出されるかに関しても意識して見るとうまくいくと思います。
…動かなかったらごめんなさい。

投稿2018/10/17 02:28

take77

総合スコア130

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

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

KawdaSyouhei

2018/10/17 03:03

take77さん!解決できました! とても詳しい解説つきで勉強になりました。 ありがとうございます! うれしー(・∀・)
take77

2018/10/17 03:18

お役に立てたようで良かったです。 私もこの辺りは理解に時間を要しましたので…。 今後ともお互い頑張りましょう。
guest

0

@places がnilってエラー。
複数のものと、単数のものの違いを理解してる?
という印象。

<% if @place.picture? %>   <%= image_tag @place.picture.thumb.url %> <% end %>

提示されたソースだけだと、わからんけど、こんなので、うまくいきそう。

投稿2018/10/16 14:17

kiichi54321

総合スコア1984

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

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

KawdaSyouhei

2018/10/17 01:58

コメントありがとうございます。 複数、単数の違い理解してないです。 また、単数に揃えてみましたがエラーが解決できなかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問