0

I'm trying to create a helper method that will display {user.name} has no submitted posts." on the profile show view of user if they haven't yet submitted any posts and display the number posts they have . currently on my show view i have <%= render @user.posts %> which displays nothing when there are 0 posts submitted.

the partial for post is :

<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>

ive tried :

  def no_post_submitted?(user)
      user.post.count(0)
      "{user.name} has not submitted any posts yet."
  end

on my user show view :

<%= if no_post_submitted?(@user) %>
<%= render @user.posts %>

which im more than sure is wrong but i have no idea how to implement this method .

4

5 回答 5

3

在您使用的地方,render @user.posts您只需添加一个简单的条件:

<% if @user.posts.empty? %>
  <p><%= @user.name %> has no submitted posts</p>
<% else %>
  <%= render @user.posts %>
<% end %>

除非您需要在多个地方使用它,否则为此创建一个助手没有多大意义。

于 2016-02-01T09:01:14.430 回答
1

如果集合为空,则渲染集合返回 nil,因此您可以使用 || 操作员:

<%= render @user.posts || "{@user.name} has not submitted any posts yet." %>

或者,如果有更多代码呈现另一个部分:

<%= render @user.posts || render 'no_posts' %>
于 2016-02-01T09:04:04.000 回答
0

在 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 %>
于 2016-02-01T09:01:24.337 回答
0

您的解决方案存在几个问题。请记住,rails 更多的是关于约定而不是配置。

您的方法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 %>
于 2016-02-01T09:04:39.853 回答
0

根据文档

如果集合为空,render 将返回 nil,因此提供替代内容应该相当简单。

<h1>Products</h1>
<%= render(@products) || "There are no products available." %>

--

所以...

  <%= render(@user.posts) || "#{@user.name} has not submitted any posts yet." %>
于 2016-02-01T09:51:37.673 回答