2016-03-23 2 views
0

У меня есть три модели, User, Movie и Review. Вот это отношение:Только разрешить пользователю создавать одну обратную связь для каждого фильма

# 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) %> 

Я не хочу, чтобы пользователь создавал другой обзор после отправки обзора для того же фильма. Вот почему я хочу скрыть кнопку «Дать обзор», если пользователь уже дал обратную связь. Как мне это сделать?

ответ

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 проверяет предыдущий обзор от того же пользователя для того же фильма.

Смежные вопросы