2016-04-30 92 views
0

我用这个页面来帮我验证,如果加入这伟大的工作Check if record exists from controller in Rails导轨 - 更新/编辑检查记录由控制器

一个新条目(在我的情况下添加一个新的运动)的存在,但我不能很如果我正在更新/编辑练习,它似乎可以起作用。

用简单的英语我想:

获取用户希望编辑(完成)当前锻炼记录,用户更新值(已完成),提交(完成),控制器检查用户的输入对db来查看一个记录是否已经存在同名,如果存在错误,如果不存在,则更新。

谢谢。

这里是我的控制,我不能完全得到去为更新的一部分:

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 
+0

什么是不工作?你有错误吗? – margo

+0

DB搜索区分大小写。因此,Exercise.where(:name => @ exercise.name).any?将始终返回false如果名称具有不同的大写/小写 –

+0

不工作的部分是我在if语句中的逻辑 - 我无法让控制器将用户的输入与表中的其他练习名称进行比较,就像我在创造,它要么总是回来说重复的条目(如果没有)或允许我进行更改,并且已经有一些具有完全相同的名称。 @CristianoAlencar,很好地了解大写/小写,如果是这种情况,如果陈述会起作用,因为每个练习名称都以大写字母开始 - 例如骑自行车 –

回答

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