【发布时间】: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