帮助方法检测用户的评论后

时间:2016-02-01 08:44:39

标签: ruby-on-rails helpermethods

我尝试创建一个帮助方法,如果用户尚未提交任何帖子并显示他们拥有的帖子数量,则会在用户的个人资料展示视图中显示<%= render @user.posts %>。目前在我的节目视图中我有<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> ,当提交0个帖子时,它不会显示任何内容。

帖子的部分是:

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

在我的用户展示视图中:

- (void)moveXrightAnimation {
    CABasicAnimation* theAnimation = ...
    [theAnimation setValue:@"movexright" forKey:@"animationID"];
//animation
}

- (void)rotate90leftAnimation {
    CABasicAnimation* theAnimation = ...
    [theAnimation setValue:@"rotate90left" forKey:@"animationID"];
//animation
}

- (void)moveXpointAnimation {
    CABasicAnimation* theAnimation = ...
    [theAnimation setValue:@"movexpoint" forKey:@"animationID"];
//animation
}

- (void)scaleAnimation {
    CABasicAnimation* theAnimation = ...
    [theAnimation setValue:@"scale" forKey:@"animationID"];
//animation
}

#pragma mark - CAAnimationDelegate

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    
    if([[anim valueForKey:@"animationID"] isEqual:@"movexright"]) {
        [self rotate90leftAnimation];
    }
    if([[anim valueForKey:@"animationID"] isEqual:@"rotate90left"]) {
        [self moveXpointAnimation];
    }
    if([[anim valueForKey:@"animationID"] isEqual:@"movexpoint"]) {
        [self scaleAnimation];
    }
}

我不确定是错的,但我不知道如何实现这个方法。

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

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

<%= render @user.posts || render 'no_posts' %>

答案 2 :(得分:0)

在Ruby方法中自动返回最后一个值,所以这个方法:

warning: string literal in condition

将始终返回一个字符串 - 如果在条件中使用字符串文字,则会使用警告count将其评估为true。这也不是你使用def no_post_submitted?(user) user.posts.empty? end 的方式 - 传递0会导致它在第0列上查询或只是错误。

所以要修复你要做的方法:

<%= if user.post.any? %>
  <%= render @user.posts %>
<% else %>
  <%= "{user.name} has not submitted any posts yet." %>
<% end %>

然而,条件是如此简单,以至于它并不真正保证辅助方法。相反,你只需写:

.sq-ui-ban {
    background-color: #abacb1;
    color: black;
    width: 1000px;
    height: auto;
    overflow: hidden;
    font-style: normal;
    font-family: Calibri;
    font-size: 20px;
    font-weight: normal;
    position: relative;
}

.moreBan {
    position: fixed;
    cursor: pointer;
    font-family: Calibri;
    background: #1c94c4;
    text-align: center;
    color: #FFFFFF;
    border: none;
    font-size: large;
    padding: 5px;
    position: absolute;
    bottom: 0px;
    right: 0px;
}

答案 3 :(得分: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 %>

答案 4 :(得分:0)

根据docs

  

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

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

-

因此...

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