class ReviewsController < ApplicationController include Pundit before_action :authenticate_user!, except: [:show, :list] before_action :set_review, only: [:show, :destroy] before_action :authorize_action def list if !params[:learning_object_id].blank? reviewable = LearningObject.find params[:learning_object_id] elsif !params[:collection_id].blank? reviewable = Collection.find params[:collection_id] end @reviews = Review.where(reviewable: reviewable) unless reviewable.blank? end # Global variables to show page def show end def new @review = Review.new @rates = Rating.all @reviewable_id = params[:reviewable_id] @reviewable_type = params[:reviewable_type] end def create review = Review.where(user: current_user, reviewable_id: params[:reviewable_id], reviewable_type: params[:reviewable_type]).new(review_params) respond_to do |format| if review.save && !params[:rates].blank? && params[:rates].is_a?(Hash) && params[:rates].size == Rating.count ratings = [] params[:rates].each { |id, value| ratings << ReviewRating.new(review: review, rating_id: id.to_i, value: value.to_i) } ReviewRating.import ratings format.html { redirect_to params[:reviewable_type].constantize.find(params[:reviewable_id]), notice: t('activerecord.attributes.review.create.notice.successfully_created') } else review.destroy format.html { redirect_to new_review_path, alert: t('activerecord.attributes.review.create.alert.there_was_an_error')} end end end def destroy redirect = @review.reviewable @review.destroy respond_to do |format| format.html { redirect_to redirect, notice: t('activerecord.attributes.review.destroy.notice.successfully_destroy') } end end # User approve or not, the review def rate review = Review.find(params[:id]) user = current_user approves = approves_param rate = Rate.where(user: user, review: review).first_or_initialize rate.update(approves: approves) render json: { approves: approves } if request.xhr? end private def set_review @review = Review.find params[:id] end # Never trust parameters from the scary internet, only allow the white list through. def review_params params.require(:review).permit(:name, :description, :pros, :cons) end def approves_param case params[:approves] when 'true' then true when 'false' then false end end def authorize_action @review||= Review.new authorize @review end end