设计相关记录验证

时间:2012-08-29 18:30:38

标签: ruby-on-rails ruby-on-rails-3

我的背景

/是一个PHP开发者。已经15年了。 Ruby对我来说是新的(我的新挑战)!

当前设置

我正在使用带有用户模型的Devise 导轨:3.2.1
设计:2.1.2

使用案例

当用户注册(通过Devise控制器)时,我想自动创建用户记录而且还要创建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记录(例如验证)时,仍然创建了用户记录(我不想这样)。我在after_create中添加了一个Raise Exception,它会回滚用户创建 但是,我更喜欢一些不错的错误处理而不是抛出异常。现在我得到一个带有异常的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

请求帮助

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

您可以使用

中的设置Flash消息重定向回相同页面,而不是引发异常
  if !foo.valid?

像这样阻止

 flash[:error] = 'error msg'

并使用

重定向
 session[:return_to] = request.referer
 redirect_to session[:return_to]

答案 1 :(得分:0)

我最终覆盖了Devise Resitrations控制器,并在create方法中放置了一个开始...救援......结束。

# 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

答案 2 :(得分:0)

您可能需要查看Rails3: Devise User has_one relationship,看看更好的建模是否可以使问题更轻松。

你现在为user.rb建模的方式确实是这样的,用户可能不存在Foo(但必须属于用户),所以它只是将:make_foo称为after_create回调,没有任何其他保证。