只允许用户为每部电影创建一个反馈
Only allow user to create one feedback for each movies
我有三个模型,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) %>
我不希望用户在为同一部电影提交评论后创建另一条评论。这就是为什么我想在用户已经提供反馈的情况下隐藏 "Give review" 按钮。我该怎么做?
类似于:
<% unless current_user.reviews.select{|review| review.movie_id == @movie.id}.count > 0 %>
<%= link_to 'Give review', new_movie_review_path(@movie) %>
<% end %>
也可以改用 where:
Review.where(user_id: current_user.id, movie_id: @movie.id).count > 0
如果您有 current_user
可供查看,那么您可以使用类似以下内容来隐藏给予评论 link:
# 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? %>
您应该在评论模型中添加一个 custom validation 来检查同一用户对同一部电影的预先存在的评论。
我有三个模型,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) %>
我不希望用户在为同一部电影提交评论后创建另一条评论。这就是为什么我想在用户已经提供反馈的情况下隐藏 "Give review" 按钮。我该怎么做?
类似于:
<% unless current_user.reviews.select{|review| review.movie_id == @movie.id}.count > 0 %>
<%= link_to 'Give review', new_movie_review_path(@movie) %>
<% end %>
也可以改用 where:
Review.where(user_id: current_user.id, movie_id: @movie.id).count > 0
如果您有 current_user
可供查看,那么您可以使用类似以下内容来隐藏给予评论 link:
# 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? %>
您应该在评论模型中添加一个 custom validation 来检查同一用户对同一部电影的预先存在的评论。