2014-09-07 3 views
1

Tout fonctionnait donc plus tôt. J'ai coupé une branche et apporté quelques modifications qui, à mon avis, n'auraient pas affecté cet attribut de l'affiche, mais j'ai eu cette erreur. Je suis passé à maître et n'a rien fusionné, et cela fonctionnait avant que je coupe la branche que je mentionne ci-dessus. Et j'ai aussi cette erreur.Erreur d'obtention: attribut inconnu: affiche

Je ne suis pas sûr de ce qui s'est passé, peut-être que j'ai tordu et mis dans une frappe quelque part mais je ne peux pas le voir.

Il dit que l'erreur est dans mon contrôleur de restaurants. J'utilise l'attribut poster dans mon show.index.html.

show.index.html:

<% @restaurant.reviews.reverse.each do |review| %> 
posted by: <%= review.poster %><br /> 
written: <%= time_ago_in_words(review.created_at) %> ago<br /> 
Review:<br /> 
<%= review.article %><br /><br /> 
<% end %> 

La méthode pour examen dans mon restaurants_controller.rb:

def review 
    @restaurant.reviews << Review.create!(review_params) ## <= this is the offending piece of code 
    redirect_to :action => "show", :id => params[:id] 
end 

La méthode de review_params dans restaurants_controller.rb:

def review_params 
    params.require(:review).permit(:poster, :article) 
end 

Je ne suis pas sûr de ce qui a changé pour me donner un attribut inconnu mais si quelqu'un pouvait aider, j'apprécierais Je l'ai mangé.

Merci!

+0

Cette méthode 'review' dans le contrôleur de restaurants est particulièrement choquant. ** 1) ** Où est attribué '@ restaurant'? ** 2) ** D'où la méthode d'examen est-elle appelée? ** 3) ** Veuillez poster le message d'erreur complet. – Substantial

+0

quel est votre statut git –

+0

@MichalSzyndel La seule chose dans l'état git est à propos de solr. –

Répondre

1

Le problème est probablement jusqu'à deux problèmes potentiels:

  1. Your poster attribute is conflicting with your poster association
  2. You don't have a poster attribute

Laissez-moi vous expliquer:


Association

À voir d'abord votre code, je l'aurais présumé votre poster "attribut" aurait, en fait, été un ActiveRecord association. Cela signifie que si vous appelez la méthode affiche , il accède aux données du modèle associé:

#app/models/review.rb 
class Review < ActiveRecord::Base 
    #fields id | poster_id | title | body | created_at | updated_at 
    belongs_to :poster, class_name: "User" 
    delegate :name, to: :poster, prefix: true #-> poster_name 
end 

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :reviews 
end 

Cette association vous donnera la possibilité d'appeler les suivantes (la base de données compte est configuré correctement) :

<% @restaurant.reviews.reverse.each do |review| %> 
    <%= review.poster_name %> 
<% end %> 

Attribut

En ce qui concerne t o votre problème d'attribut - la ligne du bas est de savoir si vous avez une colonne appelée poster dans votre modèle/table Review.

To give you a more detailed explanation, you must remember that Rails is an object-orientated framework (by virtue of being built on Ruby), which means that every time you perform any functionality with it, it will "build" objects for you. We see these objects as our Models , but in reality, they are just Ruby classes with "attributes" appended to them, depending on the database.

Vous pouvez le voir plus évidemment avec this documentation - chaque fois que vous initialisez une classe Rails/Ruby, il est en fait « construire » un objet avec une série de instance methods que nous connaissons comme ses attributs :

enter image description here

Cela signifie que si vous recevez une erreur « attribut inconnu », cela signifie que votre Model ne peut pas construire les attributs que vous désirez. La définition de base pour cela est que vous n'avez pas la colonne correcte dans votre base de données, mais de plus, vous pouvez être en mesure de résoudre avec une solution simple (hack).

Je recommande fortement serait la création d'une migration pour remplir une affiche colonne dans votre base de données. Cependant, pour voir si c'est le problème ou non, vous voudrez peut-être utiliser attr_accessor pour créer un « attribut virtuel »:

#app/models/review.rb 
class Review < ActiveRecord::Base 
    attr_accessor :poster #-> to test whether this will resolve the issue 
end 
+0

L'ajout de 'attr_accessor: poster' a fonctionné. –

+1

Dites-moi l'erreur. Signifie qu'une autre partie de votre code a un problème –

+1

'attr_accessor: poster' a fonctionné. Je pense que ça va être moi ne comprenant pas git et db. Je n'allais pas laisser les gens entrer l'affiche sur une revue et lier l'authentification de l'utilisateur de la conception à l'examen. J'ai donc ajouté une migration et dans le fichier de migration: 'remove_column: reviews,: poster'. Puis db: migrer. Puisque je n'ai pas fusionné cette branche, je pensais que j'aurais toujours la colonne affiche dans la base de données. Mais je ne fais pas moi? J'ai besoin de récupérer ça. J'ai exécuté 'rake db: migrate' ma branche de test pensant que ça se recréerait mais ça ne l'a pas corrigé. Donc pas sûr de savoir comment récupérer poster. –