2011-01-27 2 views
0

У меня есть модель с before_create и before_update обратными вызовами, которые могут return false. Модель НЕ сохраняется, когда обратные вызовы терпят неудачу (как и ожидалось), однако мой контроллер перенаправляет на путь индекса на модели, которая не создается (в отличие от визуализации нового шаблона). Мой код:Понимание `response_with` in Rails

class Person 
    before_create :reversify 
    before_update :reversify 

    def reversify 
    return false if self.name.blank? 
    self.name = self.name.reverse 
    end 
end 

class PeopleController < ApplicationController 

    respond_to :html 

    def new 
    @person = Person.new 
    respond_with(@person) 
    end 

    def create 
    @person = Person.create(params[:person]) 
    respond_with(@person) 
    end 

end 

ответ

2

respond_with использует наличие/отсутствие @person.errors для определения соответствующего RESTful ответа.

Я собираюсь теоретически утверждать, что, поскольку вы полагаетесь на использование отказоустойчивых обратных вызовов, чтобы предотвратить сохранение недействительных объектов, ActiveRecord не заполняет @person.errors, что приводит к ActionController::Responder, определяющему, что сохранение было успешным.

Я предлагаю переписывание своего класса Person использовать проверку:

class Person 
    before_save :reversify 

    validates :name, :presence => true 

    def reversify  
    self.name.reverse! 
    end 
end 
+0

спасибо Дэну. Извините, что я не смог указать пример выше, был значительно упрощен (я фактически интегрируюсь с сервисом обработки платежей), но в итоге я отказался от использования 'responses_with' и вернулся к блоку' response_to'. Приветствия. –