【问题标题】:Only allow user to create one feedback for each movies只允许用户为每部电影创建一个反馈
【发布时间】:2016-03-23 13:31:31
【问题描述】:

我有三个模型,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) %>

我不希望用户在为同一部电影提交评论后创建另一个评论。这就是为什么如果用户已经给出反馈,我想隐藏“给出评论”按钮。我该怎么做?

【问题讨论】:

    标签: ruby-on-rails actionview


    【解决方案1】:

    类似:

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

    【讨论】:

      【解决方案2】:

      您应该在评论模型中添加custom validation,以检查同一用户对同一部电影的预先存在的评论。

      【讨论】:

        【解决方案3】:

        如果您有可用于查看的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? %>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-25
          • 2012-06-02
          • 2020-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多