0

我的背景

/曾经是 PHP 开发人员。已经15年了。Ruby 对我来说是新的(我的新挑战)!

当前设置

我正在使用带有用户模型的设计。
Rails:3.2.1
设计:2.1.2

用例

当用户注册时(通过设计控制器),我想创建用户记录,但也自动创建一个 Foo 记录。我创建了一个 after_create 来处理 Foo 记录的创建。

Class User < ActiveRecord::Base

  after_create :make_foo

  def make_foo
    Foo.create(
      :name => name,
      :user_id => id
    )
  end

end

Class Foo < ActiveRecord::Base

    belongs_to :user

end

症状

我有一个问题,当没有创建 Foo 记录(例如验证)时,仍然创建了 User 记录(我不想要那个)。我在 after_create 中添加了一个引发异常,它会回滚用户创建。
但是,我更喜欢一些不错的错误处理而不是抛出异常。现在我得到一个带有该异常的 500 错误页面。我希望表格可以再次显示失败的原因。

Class User < ActiveRecord::Base

  after_create :make_foo

  def make_foo
    foo = Foo.create(
      :name => name,
      :user_id => id
    )
    if !foo.valid?
      raise Exception.new('Foo creation failed.')
    end
  end

end

请求帮助

有什么建议么?

4

3 回答 3

0

我最终覆盖了 Devise Resitrations Controller 并在 create 方法中放置了 begin...rescue...end。

# routes.rb
devise_for :users, :controllers => { :registrations => "my_devise/registrations" }

# app/controllers/my_devise/registrations_controller.rb
class MyDevise::RegistrationsController < Devise::RegistrationsController
  def create
    begin
      super
    rescue Exception
      self.resource.errors[:base] << "My error message here"
      clean_up_passwords resource
      respond_with resource
    end
  end
 end
于 2012-08-29T21:58:05.017 回答
0

您可以通过在其中设置 flash 消息重定向回同一页面,而不是引发异常

  if !foo.valid?

像这样阻止

 flash[:error] = 'error msg'

并使用重定向

 session[:return_to] = request.referer
 redirect_to session[:return_to]
于 2012-08-29T18:35:34.867 回答
0

您可能想查看Rails3:设计用户 has_one 关系,看看更好的建模是否可以使问题更容易。

您现在对 user.rb 建模的方式确实是 User可能在没有 Foo 的情况下存在(但它必须属于 User),因此它只是:make_foo作为after_create回调调用而没有任何其他保证。

于 2012-08-29T21:59:01.783 回答