理解Rails中的`respond_with`

时间:2011-01-27 22:09:02

标签: ruby-on-rails

我的模型包含before_createbefore_update回调,可以return false。当回调失败时(如预期的那样)不会保存模型,但是我的控制器会重定向到未创建模型的索引路径(而不是渲染新模板)。我的代码是:

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

1 个答案:

答案 0 :(得分: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