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>)
empty?のほうには、どんなエラーが出ましたか?
失礼しました。載せきれていませんでした!
p.empty?
Traceback (most recent call last):
1: from (irb):16
NoMethodError (undefined method `empty?' for #<Patron:0x00007fa1a7e6cfd0>)
エラーメッセージのとおりで、empty?を呼び出す対象を間違えています。ビューと揃えて、Productから.patrons.empty?としてみてください。
(本題の動作とは別件なので、こちらで済ませています)
うまくいきません、、、
=> #<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>)
すみません、ちょっと間違えてました(すでに修正済みです)
ありがとうございます!Productからというのはどういうことでしょう?
ビューで現れる@productは、Product.findのような方法で取得したインスタンスではないのでしょうか。
patronsと複数形になっている集合体にできる操作と、Patron.findで取ってきた1個にできる操作は異なります。
あーーなるほど!ありがとうございます!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>)
恐らくですが、empty?は、配列(ハッシュは不明)が格納された変数の後にしか呼び出せないのではないでしょうか?
p = Product.find(2) だと、pの中身は1つしか変数が入っていない(配列ではない)ので、empty?メソッドが用意されていない、と考えたらよさそうです。
ハッシュに対して実行できるかどうかは、ちょっと今試せないのでわかりません。
なるほど!そういうことでしたか、納得です!
回答1件
あなたの回答
tips
プレビュー