设计:在没有覆盖注册控制器的情况下放置逻辑的位置

时间:2011-10-20 21:03:24

标签: ruby-on-rails devise

在通过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正确编码?

3 个答案:

答案 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