2016-03-23 18 views
0

Üç modelim var, User, Movie ve Review. İşteKullanıcıların her film için bir geri bildirim oluşturmasına izin ver

# User.rb 
has_many :movies 
has_many :reviews 

# Movie.rb 
belongs_to :user 
has_many :reviews 

# Review.rb 
belongs_to :movies 
belongs_to :users 

yolları edilir:

# 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 

Ben şov sayfasında ardından yeni ve kısmi Formunuzu oluşturup: Burada
# routes.rb 
resources :movies do 
resources :reviews 
end 

kontrolör İşte ilişkisi film, belirli bir film için yeni yorum oluşturma butonunu göstermek için bu kod satırını oluşturuyorum:

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

Aynı film için bir inceleme gönderdikten sonra kullanıcının başka bir inceleme yapmasını istemiyorum. Bu yüzden kullanıcı geribildirimi verdiyse "İnceleme ver" düğmesini gizlemek istiyorum. Bunu nasıl yaparım?

cevap

2

şey gibi:

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

da kullanmak Could nereye yerine:

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

görünümler için kullanılabilir current_user o zaman İnceleme linki ver gizlemek için aşağıdaki gibi bir şey olabilir varsa:

# 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

İnceleme modeline custom validation ekleyebilmeniz gerekir. Aynı film için aynı kullanıcıdan daha önce yapılan bir incelemeyi kontrol eder.

İlgili konular