2016-10-28 5 views
0

Rails 5 ПриложениеRails 5: @ post.comments пуст, но <% @ если post.comments%> не выполняет блок еще и вместо этого действует, как если бы верно

Я имеющий вопрос, где внутри зрения у меня есть простой набор тегов ERB:

<% if @post.comments %> 
    <p>Comments here</p> 
<% else %> 
    <p>No comments yet</p> 
<% end %> 

Очевидно, что если комментарии не существуют в @post, чтобы выполнить нижний блок кода. Есть комментариев нет в базе данных, прикрепленных к этому @post или любых других post. Тем не менее, он выполняет верхний блок, и я вижу <p>Comments here</p> на странице.

Если я byebug внутри вида, @post.commments.any? возвращает false. и @post.comments Возврат:

Comment Load (1.3ms) SELECT "comments".* FROM "comments" WHERE "comments"."commentable_id" = $1 AND "comments"."commentable_type" = $2 [["commentable_id", 4], ["commentable_type", "Post"]] 
#<ActiveRecord::Associations::CollectionProxy []> 

Это не считается ложным? Не должно <% if @post.comments %> перейти к блоку else?

Схема:

create_table "comments", force: :cascade do |t| 
    t.text  "body" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    t.integer "commentable_id" 
    t.string "commentable_type" 
end 

create_table "forums", force: :cascade do |t| 
    t.string "name" 
    t.text  "description" 
    t.integer "user_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.index ["user_id"], name: "index_forums_on_user_id", using: :btree 
end 

create_table "posts", force: :cascade do |t| 
    t.string "title" 
    t.text  "description" 
    t.integer "user_id" 
    t.integer "forum_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.index ["forum_id"], name: "index_posts_on_forum_id", using: :btree 
    t.index ["user_id"], name: "index_posts_on_user_id", using: :btree 
end 

create_table "users", force: :cascade do |t| 
    t.string "email",     default: "", null: false 
    ... 
    # Devise stuff removed for brevity. 
    ... 
end 

add_foreign_key "posts", "forums" 
add_foreign_key "posts", "users" 

Мои модели:

#User model. 
has_many :forums 
has_many :posts 

#Forum model. 
belongs_to :user 
has_many :posts 

#Post model. 
belongs_to :user 
belongs_to :forum 

#Comment model. 
belongs_to :commentable, polymorphic: true 
has_many :comments, as: :commentable 

ответ

1

Потому что в Руби просто false и nil являются falsey значения. Я имею в виду те значения, которые являются ложными в булевом контексте. В вашем коде вероятно @post.comments is [] и [] is true in Ruby.

+0

Ах, я должен подумать об этом. Я не знаю, почему я этого не сделал, это не мой первый раз с Rails. Я обвиняю конец рабочего дня. '@ post.comments.any?' - это решение. – Antonio

+0

Да, это решение :) – Ursus

1

Его потому, что @post.comments не имеет записей, а пустой массив является истинным объектом в рубине. Только ноль и ложь ложны.

Вы должны изменить свой код, чтобы спросить if @post.comments.present?

 Смежные вопросы

  • Нет связанных вопросов^_^