我是 /是一个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
有什么建议吗?
答案 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
回调,没有任何其他保证。