Вспомогательный метод обнаружения пост - комментарий от пользователя
Я пытаюсь создать вспомогательный метод, который будет отображать {user.name} has no submitted posts."
в профиле показать вид пользователя, если он еще не отправил ни одного сообщения, и отобразить количество сообщений, которые они имеют. в настоящее время на моем шоу-шоу у меня есть <%= render @user.posts %>
который ничего не отображает, когда отправлено 0 сообщений.
частичное для сообщения:
<div class="media">
<%= render partial: 'votes/voter', locals: { post: post } %>
<div class="media-body">
<h4 class="media-heading">
<%= link_to post.title, topic_post_path(post.topic, post) %>
<%= render partial: "labels/list", locals: { labels: post.labels } %>
</h4>
<small>
submitted <%= time_ago_in_words(post.created_at) %> ago by <%= post.user.name %> <br>
<%= post.comments.count %> Comments
</small>
</div>
</div>
я пробовал:
def no_post_submitted?(user)
user.post.count(0)
"{user.name} has not submitted any posts yet."
end
на моем представлении просмотра пользователя:
<%= if no_post_submitted?(@user) %>
<%= render @user.posts %>
что я более чем уверен, что это неправильно, но я понятия не имею, как реализовать этот метод.
5 ответов
Где вы используете render @user.posts
Вы можете просто добавить простое условие:
<% if @user.posts.empty? %>
<p><%= @user.name %> has no submitted posts</p>
<% else %>
<%= render @user.posts %>
<% end %>
Не было бы особого смысла создавать помощника для этого, если вам не нужно использовать его в нескольких местах.
Render collection возвращает nil, если коллекция пуста, поэтому вы можете использовать || оператор:
<%= render @user.posts || "{@user.name} has not submitted any posts yet." %>
Или, если есть больше кода, рендерит другой фрагмент:
<%= render @user.posts || render 'no_posts' %>
Есть несколько проблем с вашим решением. Помните, что рельсы - это скорее соглашение о конфигурации.
Ваш метод no_post_submitted?
должен на самом деле вернуться true/false
так как его метод заканчивается ?
, Также это должно быть названо no_posts_submitted?
для ясности. Это должно выглядеть примерно так:
def no_post_submitted?(user)
user.posts.count > 0
end
Затем должен быть другой вспомогательный метод, который будет печатать необходимое сообщение:
def no_posts_message(user)
"{user.name} has not submitted any posts yet."
end
И в конце концов вы можете подключить его так:
<% if no_posts_submitted?(user) %>
<%= no_posts_message(user) %>
<% else>
<%= render @user.posts %>
<% end %>
Согласно документам:
В случае, если коллекция пуста, render вернет nil, поэтому предоставить альтернативный контент должно быть довольно просто.
<h1>Products</h1> <%= render(@products) || "There are no products available." %>
-
Так...
<%= render(@user.posts) || "#{@user.name} has not submitted any posts yet." %>
В методах Ruby автоматически возвращается последнее значение, поэтому этот метод:
def no_post_submitted?(user)
user.post.count(0)
"{user.name} has not submitted any posts yet."
end
Всегда будет возвращать строку - если вы используете строковый литерал в условии, он будет оценен как true с предупреждением warning: string literal in condition
, И это не то, как вы используете count
- передача 0 вызовет запрос к столбцу 0 или просто ошибку.
Чтобы исправить метод, вы должны сделать:
def no_post_submitted?(user)
user.posts.empty?
end
Однако это условие настолько просто, что на самом деле не требует вспомогательного метода. Вместо этого вы бы просто написать:
<%= if user.post.any? %>
<%= render @user.posts %>
<% else %>
<%= "{user.name} has not submitted any posts yet." %>
<% end %>