Вспомогательный метод обнаружения пост - комментарий от пользователя

Я пытаюсь создать вспомогательный метод, который будет отображать {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 %>
Другие вопросы по тегам