2016-03-23 3 views
0

Ich habe drei Modelle, User, Movie und Review. Hier ist die Beziehung:Lassen Sie den Benutzer nur eine Rückmeldung für jeden Film erstellen

# User.rb 
has_many :movies 
has_many :reviews 

# Movie.rb 
belongs_to :user 
has_many :reviews 

# Review.rb 
belongs_to :movies 
belongs_to :users 

Hier ist die Routen:

# routes.rb 
resources :movies do 
resources :reviews 
end 

Hier ist die Steuerung:

# reviews_controller.rb 
class ReviewsController < ApplicationController 
    before_action authenticate_user! 
    before_action :find_movie 
    before_action :find_review, only: [:edit, :update, :destroy] 

    def new 
    @review = Review.new 
    end 

    def create 
    @review = Review.new(review_params) 

    if @review.save 
     redirect_to movie_path(@movie) 
    else 
     render 'new' 
    end 
    end 

    def edit 
    end 

    def update 
    if @review.update(review_params) 
     redirect_to movie_path(@movie) 
    end 
    end 

    private 
    def find_movie 
     @movie = Movie.find(params[:movie_id]) 
    end 

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

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

habe ich eine neue und teilweise Form und dann in der Show-Seite von der Film, ich erstelle diese Codezeile, um die Schaltfläche zum Erstellen neuer Rezension für einen bestimmten Film anzuzeigen:

# views/movies/show.html.erb 
<%= link_to 'Give review', new_movie_review_path(@movie) %> 

Ich möchte nicht, dass der Nutzer eine neue Bewertung erstellt, nachdem er eine Rezension für denselben Film eingereicht hat. Deshalb möchte ich die Schaltfläche "Bewertung abgeben" ausblenden, wenn der Benutzer bereits Feedback gegeben hat. Wie mache ich das?

Antwort

2

Etwas wie:

<% unless current_user.reviews.select{|review| review.movie_id == @movie.id}.count > 0 %> 
    <%= link_to 'Give review', new_movie_review_path(@movie) %> 
<% end %> 

Könnte auch verwenden, wo statt:

Review.where(user_id: current_user.id, movie_id: @movie.id).count > 0 
0

Wenn Sie die current_user zur Verfügung Ansichten dann können Sie so etwas wie die Bewertung Link Geben Sie verstecken folgenden haben:

# views/movies/show.html.erb 
<%= link_to 'Give review', new_movie_review_path(@movie) unless current_user.movies.where(id: @movie.id).first.comments.any? %> 
0

Sie sollten eine custom validation in das Review-Modell hinzufügen h sucht nach einer bereits vorhandenen Rezension desselben Benutzers für denselben Film.

Verwandte Themen