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

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

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

708閲覧

empty?とexists?のこの場面での違いを教えてください!

sn.jr

総合スコア53

Ruby

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

Ruby on Rails

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

1グッド

1クリップ

投稿2020/01/04 12:36

編集2020/01/04 14:12

1はunlessの直下つまりformが表示されるのですが、2は<p>すでにパトロンになっています</p>が表示されます。empty?とexists?の違いを把握しようとrails cを行ったのですがエラーでした。exists?に関してはrailsのヘルパーメソッドなのでエラーが出るのは納得なのですが、empty?に関してはなぜエラーが出るのかわかりません。

1

rb

1<% unless @product.patrons.exists? %> 2 <%= form_with model: [@product, @patron], local: true do |form| %> 3 <div class="field"> 4 <%= form.label :金額 %> 5 <%= form.number_field :donation, class:"form-control" %> 6 </div> 7 <%= form.submit class:"btn btn-primary" %> 8 <% end %> 9 <% else %> 10 <p>すでにパトロンになっています</p> 11 <% end %>

2

rb

1<% if @product.patrons.empty? %> 2 <%= form_with model: [@product, @patron], local: true do |form| %> 3 <div class="field"> 4 <%= form.label :金額 %> 5 <%= form.number_field :donation, class:"form-control" %> 6 </div> 7 <%= form.submit class:"btn btn-primary" %> 8 <% end %> 9 <% else %> 10 <p>すでにパトロンになっています</p> 11 <% end %>
p = Patron.find(1) Patron Load (32.7ms) SELECT "patrons".* FROM "patrons" WHERE "patrons"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] => #<Patron id: 1, user_id: 1, product_id: 6, donation: 77777, created_at: "2019-12-28 10:56:28", updated_at: "2019-12-28 10:56:28"> irb(main):016:0> p.empty? Traceback (most recent call last): 1: from (irb):16 NoMethodError (undefined method `empty?' for #<Patron:0x00007fa1a7e6cfd0>)
DrqYuto👍を押しています

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

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

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

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

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

maisumakun

2020/01/04 14:10

empty?のほうには、どんなエラーが出ましたか?
sn.jr

2020/01/04 14:12

失礼しました。載せきれていませんでした! p.empty? Traceback (most recent call last): 1: from (irb):16 NoMethodError (undefined method `empty?' for #<Patron:0x00007fa1a7e6cfd0>)
maisumakun

2020/01/04 14:16 編集

エラーメッセージのとおりで、empty?を呼び出す対象を間違えています。ビューと揃えて、Productから.patrons.empty?としてみてください。 (本題の動作とは別件なので、こちらで済ませています)
sn.jr

2020/01/04 14:16

うまくいきません、、、 => #<Patron id: 1, user_id: 1, product_id: 6, donation: 77777, created_at: "2019-12-28 10:56:28", updated_at: "2019-12-28 10:56:28"> irb(main):020:0> p.patrons.empty? Traceback (most recent call last): 1: from (irb):20 NoMethodError (undefined method `patrons' for #<Patron:0x00007fa1a7e6cfd0>)
maisumakun

2020/01/04 14:17

すみません、ちょっと間違えてました(すでに修正済みです)
sn.jr

2020/01/04 14:18

ありがとうございます!Productからというのはどういうことでしょう?
maisumakun

2020/01/04 14:22

ビューで現れる@productは、Product.findのような方法で取得したインスタンスではないのでしょうか。 patronsと複数形になっている集合体にできる操作と、Patron.findで取ってきた1個にできる操作は異なります。
sn.jr

2020/01/04 14:27

あーーなるほど!ありがとうございます!p.patrons.empty?は出力させることができました!ちなみに理解を深めるためにお聞きしたいのですが、下記のp.empty?はなぜエラーになってしまうのでしょうか?pはデータとしてはあるので、falseと出ることを期待していたのですが p = Product.find(2) Product Load (15.0ms) SELECT "products".* FROM "products" WHERE "products"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]] => #<Product id: 2, title: "wsss", price: 2000, description: "ddd", created_at: "2020-01-03 14:41:53", updated_at: "2020-01-03 14:41:53", message: nil, status: "draft", user_id: 1, image: nil> irb(main):028:0> p.empty? Traceback (most recent call last): 1: from (irb):28 NoMethodError (undefined method `empty?' for #<Product:0x00007fa1ae0b9328>)
siruku6

2020/01/05 01:39 編集

恐らくですが、empty?は、配列(ハッシュは不明)が格納された変数の後にしか呼び出せないのではないでしょうか? p = Product.find(2) だと、pの中身は1つしか変数が入っていない(配列ではない)ので、empty?メソッドが用意されていない、と考えたらよさそうです。 ハッシュに対して実行できるかどうかは、ちょっと今試せないのでわかりません。
sn.jr

2020/01/05 01:51

なるほど!そういうことでしたか、納得です!
guest

回答1

0

自己解決

質問の追記より解決

ビューで現れる@productは、Product.findのような方法で取得したインスタンスではないのでしょうか。

patronsと複数形になっている集合体にできる操作と、Patron.findで取ってきた1個にできる操作は異なります。

投稿2020/01/05 01:52

sn.jr

総合スコア53

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問