2013-11-26 2 views
0

Я был на это некоторое время и нуждался в более разумном мнении. Я пытаюсь проверить код доступа, который у меня есть в моей базе, соответствует паролю, который вводит пользователь, чтобы удалить запись. Я считаю, что я должен делать это в модели, и я рефакторинг использую метод before_destroy. Однако я не могу даже запустить метод before_destroy, когда я нажимаю кнопку удаления, которую я сделал. Однако контроллер выполняет метод уничтожения.Rails не может получить before_destroy для вызова при удалении

Посмотреть

<%= button_to('Destroy', @dish, method: "delete") %> 

модель - путы passcode_check? никогда не вызывается из того, что я вижу

class Dish < ActiveRecord::Base 
    before_destroy :passcode_check? 
    validates :username, presence: true 
    validates :passcode, presence: true 
    validates :guests, numericality: { only_integer: true, greater_than_or_equal_to: 0 } 

    private 

    def passcode_check? 
    puts "passcode_check?" 
    if @dish.passcode != params[:pass] 
     @dish.errors.add(:base, 'Unable to delete record; Reason: Passcodes did not match.') 
     return false 
    else 
     @dish.errors.add(:base, 'test.') 
     return false 
    end 
    end 
end 

Controller - этот метод наплыва, как я хочу, чтобы проверить в модели

def destroy 
    if @dish.passcode == params[:pass] 
     @dish.destroy unless @dish.errors 
     respond_to do |format| 
     format.html { redirect_to dishes_url, notice: 'Record delete.' } 
     format.json { head :no_content } 
     end 
    else 
     respond_to do |format| 
     format.html { redirect_to @dish, action: 'show', notice: 'Unable to delete record; Reason: Passcodes did not match.' } 
     format.json { render json: @dish.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
+0

Есть ли '@ dish.errors'? –

+0

Действительно ли запись полностью уничтожена? – Niall

ответ

1

В контроллере вы используете @dish.errors, который всегда будет возвращать ActiveModel::Errors объект и, следовательно, быть правдивыми. Таким образом, модификатор unless @dish.errors никогда не пропускает @dish.destroy, и, следовательно, ни один из ваших обратных вызовов не будет. Измените его на:

@dish.destroy if @dish.errors.empty? 

И это должно быть так. Хотя пока не имеет смысла проверять ошибки, поскольку проверки не выполняются. Просто позвоните @dish.destroy и позвольте вашему обратному вызову before_destroy остановить удаление, вернув false, и, наоборот, пусть удаление произойдет, вернув true.

+0

Спасибо за объяснение, я вижу, что теперь я блокирую свой собственный звонок. – user1652528

Смежные вопросы