2016-03-23 66 views
0

一個反饋我有三個型號,UserMovieReview。這裏是關係:只允許用戶爲每個電影

# User.rb 
has_many :movies 
has_many :reviews 

# Movie.rb 
belongs_to :user 
has_many :reviews 

# Review.rb 
belongs_to :movies 
belongs_to :users 

這裏是路線:

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

這裏是控制器:

# 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 

我創建了一個新的,局部的形式,然後在展示頁面在電影中,我創建了這行代碼來顯示爲特定電影創建新評論的按鈕:

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

我不希望用戶在爲同一部電影提交評論後創建其他評論。這就是爲什麼如果用戶已經提供了反饋,我想隱藏「Give review」按鈕。我怎麼做?

回答

2

喜歡的東西:

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

也可以使用其中代替:

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

如果有可供欣賞current_user那麼你可以像下面隱藏給予評論鏈接:

# 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

您應該在評論模型中添加custom validation WHIC h檢查來自同一用戶的針對同一電影的預先存在的評論。