2016-02-01 1 views
0

J'essaye de créer une méthode d'aide qui montrera {user.name} has no submitted posts." sur la vue d'affichage de profil de l'utilisateur s'ils n'ont pas encore soumis de messages et n'affiche pas les messages qu'ils ont. actuellement sur ma vue de spectacle j'ai <%= render @user.posts %> qui n'affiche rien quand il y a 0 messages soumis.Helper Méthode détecter post - commentaire de l'utilisateur

la partie post est:

<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 essayé:

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

sur mon avis show utilisateur:

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

qui im ​​plus sûr qui ne va pas, mais je dois aucune idée de comment implémenter cette méthode.

Répondre

3

Si vous utilisez render @user.posts vous pouvez simplement ajouter d'un simple conditionnel:

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

Il n'y aurait pas beaucoup de point la création d'une aide pour cela à moins que vous devez l'utiliser en plusieurs endroits.

+0

Merci beaucoup ce fait l'affaire. Je me suis dit, mais pour une raison quelconque, j'ai pensé que faire une méthode d'aide rendrait cela plus facile mais pas vraiment. –

0

Dans les méthodes Ruby reviennent automatiquement la dernière valeur si cette méthode:

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

retourne toujours une chaîne - si vous utilisez une chaîne de caractères dans un état où il sera évalué comme vrai avec l'avertissement warning: string literal in condition. Aussi, ce n'est pas la façon dont vous utilisez count - en lui passant 0 l'amènera à interroger sur la colonne 0 ou juste erreur.

Donc, pour fixer la méthode que vous feriez:

def no_post_submitted?(user) 
    user.posts.empty? 
end 

Cependant que sous condition est si simple qu'il ne justifie pas vraiment une méthode d'assistance. Au lieu de cela, vous écrivez simplement:

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

La collection de rendu renvoie zéro si la collection est vide, vous pouvez donc utiliser le || opérateur:

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

Ou s'il y a plus de code rendre une autre partie:

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

Il y a quelques problèmes avec votre solution. Rappelez-vous, les rails sont plus sur la convention que sur la configuration.

Votre méthode no_post_submitted? doit effectivement renvoyer true/false car sa méthode se termine par ?. Aussi, il devrait être nommé no_posts_submitted? pour plus de clarté.Il devrait ressembler à ceci:

def no_post_submitted?(user) 
    user.posts.count > 0 
    end 

Ensuite, il devrait y avoir une autre méthode d'assistance qui imprimera votre message nécessaire, quelque chose comme:

def no_posts_message(user)  
    "{user.name} has not submitted any posts yet." 
end 

Et finalement, vous pouvez brancher tout en comme ceci:

<% if no_posts_submitted?(user) %> 
<%= no_posts_message(user) %> 
<% else> 
<%= render @user.posts %> 
<% end %> 
0

Selon le docs:

Dans le cas où la collection est vide, render retournera zéro, donc il devrait être assez simple de fournir un contenu alternatif.

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

-

Alors ...

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