【问题标题】:Rails - update/edit check if record exists from controllerRails - 更新/编辑检查控制器是否存在记录
【发布时间】:2016-08-25 15:27:30
【问题描述】:

我使用此页面来帮助我验证是否添加了一个新条目(在我的情况下添加一个新练习)效果很好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

【问题讨论】:

  • 什么不起作用?你有错误吗?
  • 数据库搜索区分大小写。因此,Exercise.where(:name => @exercise.name).any?如果名称有不同的大写/小写,将始终返回 false
  • 不起作用的部分是我在 if 语句中的逻辑 - 我无法让控制器像我在创建时那样将用户的输入与表中的其他练习名称进行比较,它要么总是出现回说重复条目(当没有重复条目时)或允许我进行更改并且有些东西已经具有完全相同的名称。 @CristianoAlencar,很高兴了解大写/小写,如果是这种情况,如果每个练习名称都以大写开头,那么 if 语句会起作用 - 例如 Cycling

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2023-03-22
    相关资源
    最近更新 更多