2016-04-30 100 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