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
Ах, я должен подумать об этом. Я не знаю, почему я этого не сделал, это не мой первый раз с Rails. Я обвиняю конец рабочего дня. '@ post.comments.any?' - это решение. – Antonio
Да, это решение :) – Ursus