如何在保存Rails Devise :: RegistrationsController之前挂钩

时间:2018-03-19 06:59:53

标签: ruby-on-rails ruby devise

我想在User保存Users::RegistrationsController < Devise::RegistrationsController之前做点什么。

我可以使用像before_save这样的回调方法,但它做了太多事情,因为我只想在RegistrationsController中使用它。

请参阅以下代码: (这是Devise::RegistrationsController#create

def create
    build_resource(sign_up_params)

    resource.do_something_i_want # <= HERE

    resource.save
    yield resource if block_given?
    if resource.persisted?
      if resource.active_for_authentication?
        set_flash_message! :notice, :signed_up
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      set_minimum_password_length
      respond_with resource
    end
end

这似乎唯一的方法是复制&amp;将create设计方法粘贴到Users::RegistrationsController

我可以更轻松地完成这项工作吗?

2 个答案:

答案 0 :(得分:0)

rails中有多个回调。您可以查看here。在你的情况下,下面将工作正常。要覆盖控制器,您需要进行多项更改。

before_create :do_something

before_save :do_something, on: :create

after_validation :do_something, on: :create

答案 1 :(得分:0)

您可以覆盖create method和

def create
  super.create do |res|
    res.do_something_i_want
  end
end

由于:如果block_given产生资源? 然而,它是你需要的一行之后的一行。 (保存后)

我不喜欢在保存之前回调after_save /,因为你最终可以在几乎无法控制的情况下添加过于匹配的逻辑。还有一些情况你不想打电话给你的回调。