Rails - 更新/编辑检查控制器是否存在记录

时间:2016-04-30 13:58:27

标签: validation ruby-on-rails-4 controller edit exists

我使用此页面来帮助我验证是否添加了一个新条目(在我的情况下添加了一个新的练习),这个条目效果很好Check if record exists from controller in Rails

但是,如果我更新/编辑练习,我似乎无法让它发挥作用。

用简单的英语我试图:

获取用户想要编辑(完成)的当前练习记录,用户更新值(完成),提交(完成),控制器检查用户对数据库的输入以查看记录是否已存在同名,如果存在错误,如果不存在,则更新。

感谢。

这是我的控制器中我无法进行更新的部分:

class ExercisesController < ApplicationController
  before_action :authenticate_user!, :except => [:index, :show]
  before_filter :set_exercise, only: [:show, :edit, :update, :destroy, :upvote, :downvote]

    def new
    @exercise = Exercise.new
  end

  def create
    @exercise = current_user.exercises.build(exercise_params)
    if Exercise.exists?(name: @exercise.name)
      flash.now[:danger] = "Exercise has not been created, duplicate entry"
      render :new
    elsif @exercise.save
      flash[:success] = "Exercise has been created"
      redirect_to exercises_path
    else
      flash.now[:danger] = "Exercise has not been created"
      render :new
    end
  end

  def edit
    if !current_user.admin?
      flash[:danger] = "You are not an admin"
      redirect_to root_path
    end
  end 

  def update
    if !current_user.admin?
      flash[:danger] = "You are not an admin"
      redirect_to root_path
    else
      if Exercise.where(:name => @exercise.name).any?
        flash.now[:danger] = "Exercise has not been updated, duplicate entry"
        render :edit
      elsif @exercise.update(exercise_params)
        flash[:success] = "Exercise has been updated"
        redirect_to @exercise
      else
        flash.now[:danger] = "Exercise has not been updated"
        render :edit
      end
    end
  end

private 
    def exercise_params
      params.require(:exercise).permit(:name, :description, :summary)
    end

    def set_exercise
      @exercise=Exercise.find(params[:id])
    end

1 个答案:

答案 0 :(得分:1)

找到一种更简单的方法来完成这项工作。在模型中,您可以指定唯一性。

 class Exercise < ActiveRecord::Base 
  validates :name, presence: true, :uniqueness => true

所以我的模型看起来像这样更新:

 def update
    if !current_user.admin?
      flash[:danger] = "You are not an admin"
      redirect_to root_path
    else
      if @exercise.update(exercise_params)
        flash[:success] = "Exercise has been updated"
        redirect_to @exercise
      else
        flash.now[:danger] = "Exercise has not been updated"
        render :edit
      end
    end
  end