2010-04-02 11 views
0

J'ai un modèle utilisateur, un modèle Post et un modèle d'intérêt.has_many through et partials


User has_many posts through interests 

User has_many interests 

Post has_many users through interests 

Post has_many interests 

Interest belongs to Post 

Interest belongs to User 

Application_Controller est la suivante:

class ApplicationController < ActionController::Base 
    before_filter :login_from_cookie 
    before_filter :find_user_interests 
    helper :all # include all helpers, all the time 
    session :session_key => '_blah_session' 

    include AuthenticatedSystem 

    def find_user_interests 
    @user_interests = current_user ? current_user.interests : [] 
    true 
    end 

end 

application.html.erb a comme suit:

<%= render :partial => "users/interests", :object => @user_interests %> 

_in terests.html.erb partielle est la suivante:

ul 
    <% unless current_user.nil? then -%> 
    <% @user_interests.each do |interest| -%> 
     li<%= interest.post.title %>/li 
    <% end %> 
    <% end -%> 
/ul  

Compte tenu de tout cela quand je localhost: 3000/messages/1 mes émissions partielles de haut bien, mais quand dans localhost: 3000/messages Je reçois un erreur undefined method 'title' for nil:NilClass donc une erreur dans la ligne li<%= interest.post.title %>/li montré ci-dessus dans le _interests.html.erb partielle.

Que diable serait le problème?

TIA

Répondre

2

Cela signifie juste que l'un des intérêts n'a pas un poste associé à l'autre extrémité. Très probablement, il a été supprimé. Cela aurait pu être évité par ce qui suit:

class Post < ActiveRecord::Base 
    has_many :interests, :dependent => :destroy 
end 

En attendant, vous devriez nettoyer les orphelins dans la base de données.

Modifier: Vous prétendez que c'était déjà dans votre modèle, mais si c'était le cas, vous ne savez pas comment vous pourriez avoir un Intérêt orphelin comme l'indique l'erreur. Peut-être qu'il a été créé avant d'avoir ajouté la clause dépendante? Encore une fois, allez supprimer les orphelins via SQL, puis réessayez. Si le problème refait surface plus tard, vous devez supprimer quelque part sans rappel.

En ce qui concerne votre problème de taille. Vous pourriez utiliser current_user.interests.count. Cela est dû à de la magie avec les associations Rails. count est une méthode spéciale sur une association Rails qui exécute SQL. length est juste une méthode tableau vous indiquant combien d'éléments sont dans le tableau. Les associations Rails ont quelques méthodes spéciales, mais le reste d'entre elles est transmis à l'objet tableau de façon transparente. Autres critiques: lorsque vous passez :object => @user_interests vous définissez une variable avec le nom du partiel. Ainsi, vous pouvez référencer la variable locale interests dans le partiel. Cependant, vous référencez @user_interests, donc passer l'objet n'est pas nécessaire. Toutes choses étant égales par ailleurs, passer l'objet et utiliser une variable locale est probablement meilleur (c'est plus explicite, plus un style de programmation fonctionnelle), mais dans ce cas vous n'utilisez pas cela. Enfin, stylewise, je peux me tromper car je n'ai pas le contexte complet, mais en général je mettrais la condition logged_in dans le template plutôt que de mettre user_interests à un tableau vide s'il n'y a pas d'utilisateur connecté. Cela vous permet de référencer current_user.interests.count dans le modèle et de définir indépendamment les intérêts à afficher (par exemple pour la pagination) dans @user_interests.

+0

J'ai couvert cela via le modèle Posts via has_many: intérêt,: dependent =>: destroy – jdog

+0

Aussi ce qui est bizarre, c'est si je sors le code dans le partial pour que dislays le titre afin de contourner cette erreur. J'ai un titre dans le partiel qui est défini comme "Vous avez @ user_interests.length intérêts" et quand je suis sur la page des messages et dis la page des messages a 10 messages mon titre se lit comme "Vous avez 10 intérêts" donc son tout compter messages comme un intérêt même si l'utilisateur n'a pas sélectionné le poste comme un intérêt. – jdog

+0

Et quand je vais à une page Posts spécifique, alors montrez l'action, sur cette page le titre référencé ci-dessus lit "Vous avez 1 intérêts" donc son semble compter le nombre de messages sur les pages spécifiques (index ou show) et totalisant ceux-ci en tant qu'utilisateurs d'utilisateurs. – jdog