在通过Devise创建用户之后,我希望发生各种事情(例如,要创建的帐户记录及其要填充各种值的字段,要更新的事务表中的字段等)。我试过“扩展”Devise的注册控制器
class MyRegistrationsController < Devise::RegistrationsController
prepend_view_path "app/views/devise"
def create
super
# Generate your profile here
@account = Account.new
@account.user = current_user.id
end
end
然而,当我使用它时,设计会停止重定向,错误检查等。我的下一个想法是在我的User.model中执行以下操作
after_create :build_user_account
def build_user_account
@account = Account.new
@account.user = current_user.id
end
但是我一直在读这个代码不应该在模型中而且我无法访问模型中的current_user。我知道这是业余的东西,但我很难过。我应该使用自己的身份验证和rip Devise,还是有办法使用Devise正确编码?
答案 0 :(得分:3)
我认为这个业务逻辑(每个用户对象都应该有一个Account)适合该模型。
您可以使用观察者执行此操作,或像您一样使用after_create回调。使用回调:
after_create :create_user_account
def create_user_account
Account.create(:user_id => self.id)
end
答案 1 :(得分:0)
在您的自定义注册控制器中,您正在调用超级,然后传递您的帐户创建逻辑。如果我没有弄错的话,对super的调用告诉它只运行Devise控制器中的代码并忽略你的代码(我必须通过控制器代码返回以确保)。我会尝试复制方法,就像你可以在Github找到的Devise控制器一样,然后传入你的逻辑。这应该允许一切按照你想要的方式工作,并且仍然有适当的重定向和验证。
如果您决定在自定义注册控制器之外执行此操作并将其放入模型中,则必须使用@Jesse Wolgamott所述的after_create
挂钩,以便您可以访问current_user方法。虽然将业务逻辑放在模型中可能不是“Rails方式”,但有时候这是不可避免的。
答案 2 :(得分:-1)
如果你是初学者,设计小组建议不要使用设计;-)那就是说,我认为设计是稳定的,足够成熟,可以代替完全自定义的解决方案。
有一件事,是的,current_user在模型中不可用(我认为)。我所做的是,在我的控制器中:
# POST /reports
# POST /reports.json
def create
@report = Report.new(params[:report])
@report[:user_id] = current_user[:id]
@report[:name_seo] = @report[:name].to_slug
虽然稍微偏离主题,但我发现这篇文章很有用:http://www.communityguides.eu/articles/11