2015-12-12 1 views
1

J'essaie de mettre en place un système d'évaluation 5 étoiles afin que les utilisateurs puissent noter les autres utilisateurs. Pour le moment, tout fonctionne (créer, supprimer, mettre à jour, etc ...) mais seul l'utilisateur connecté peut évaluer lui-même. Je ne peux pas évaluer les autres utilisateurs. Je ne reçois aucune erreur, il redirige juste vers la page de profil de l'utilisateur comme il se doit mais sans ajouter une note à cet utilisateur.Évaluation des utilisateurs de Rails, je ne peux me donner aucune opinion

user.rb

class User < ActiveRecord::Base 
has_many :reviews 

review.rb

class Review < ActiveRecord::Base 
    belongs_to :user 
end 

reviews_controller.rb

class ReviewsController < ApplicationController 

before_action :find_user 
before_action :find_review, only: [:edit, :update, :destroy] 

def new 
    @review = Review.new 
end 

def create 
    @review = Review.new(review_params) 
    @review.user_id = current_user.id 
    if @review.save 
    redirect_to user_path(@user) 
    else 
    render 'new' 
    end 
end 

def edit 
end 

def update 
    if @review.update(review_params) 
    redirect_to user_path(@user) 
    else 
    render 'edit' 
    end 
end 

def destroy 
    @review.destroy 
    redirect_to user_path(@user) 
end 

private 

def review_params 
    params.require(:review).permit(:rating, :comment) 
end 

def find_user 
    @user = User.find(params[:user_id]) 
end 

def find_review 
    @review = Review.find(params[:id]) 
end 

end 

_form qui est ensuite rendu à la page show:

<%= simple_form_for([@user, @user.reviews.build]) do |f| %> 
    <div id="rating-form"> 
    <label>Rating</label> 
    </div> 
    <%= f.input :comment %> 
    <%= f.button :submit %> 

<% end %> 

<script> 
    $('#rating-form').raty({ 
    path: '/assets/', 
    scoreName: 'review[rating]' 
    }); 
</script> 

Toute aide pour que cela fonctionne serait grandement appréciée !!

+0

Il semble que votre modèle 'Rating' n'a qu'une association avec l'utilisateur (' belongs_to: user'). Mais vous en aurez besoin de deux: un pour l'utilisateur évalué et un pour l'utilisateur qui a fait l'évaluation. – spickermann

Répondre

1

Faites ceci:

#config/routes.rb 
resources :users do 
    resources :reviews, only: [:new, :create] 
end 


#app/models/review.rb 
class Review < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :reviewed, class_name: "User", foreign_key: :reviewed_id 
end 

#app/controllers/reviews_controller.rb 
class ReviewsController < ApplicationController 
    def new 
     @review = current_user.reviews.new 
    end 

    def create 
     @review = current_user.reviews.new review_params 
     @review.save 
    end 

    private 

    def review_params 
     params.require(:review).permit(:rating, :comment).merge(reviewed_id: params[:user_id]) 
    end 
end 

#app/views/reviews/new.html.erb 
<%= form_for @review do |f| %> 
    <%= f.number_field :rating %> 
    <%= f.text_field :comment %> 
    <%= f.submit %> 
<% end %> 

Cela signifie que vous devrez inclure dans votre table reviews une colonne reviewed_id.

Vous serez en mesure d'accéder à l'aide: url.com/users/:user_id/reviews/new

L'application remplira automatiquement les champs user_id et reviewed_id, de sorte que le reste de votre code devrait fonctionner avec la mise à niveau.

Le grand problème que vous avez est que vous enregistrez essentiellement le user_id (probablement de qui créé l'examen) ... mais n'a aucun moyen de l'examen qui stipulant est à propos.

Le code ci-dessus corrige cela pour vous.

+0

Merci pour votre réponse. J'ai modifié mon code avec le code que vous avez fourni et j'ai ajouté la colonne, mais je suis toujours dans une situation similaire. J'ai actuellement un formulaire d'évaluation sur chaque page de profil d'utilisateur, mais maintenant, peu importe quelle page de profil d'utilisateur j'essaie de noter, la note affecte toujours le current_user. En outre, le formulaire que vous avez posté me donne une erreur "méthode non définie' review_path '", mais" form_for ([@ utilisateur, @ user.reviews.build]) fonctionne | f | ". –

+0

Je pense que je l'ai peut-être corrigé en utilisant "@ user.reviews.new review_params" au lieu de "current_user.reviews.new" sous reviews_controller.rb -> def new. Je reviendrai bientôt après quelques essais et accepterai la réponse. –

+0

Ok, il ne semble pas encore résolu. L'id_utilisateur et l'id_examiné sont identiques et tous les deux sont définis sur l'ID utilisateur de l'utilisateur "noté". (Pas le noteur). –