0

special_method我正在使用设计,如果用户模型更新成功,我想添加一个。下面是我继承的registrationsController的源代码。

我只想添加一行,special_method即注释的方法。

类设计::注册控制器 < 设计控制器

def update
  self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
  prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)

  if resource.update_with_password(account_update_params)
    # Where I want to run `special_method` on my updated user
    if is_navigational_format?
      flash_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ?
        :update_needs_confirmation : :updated
      set_flash_message :notice, flash_key
    end
    sign_in resource_name, resource, :bypass => true
    respond_with resource, :location => after_update_path_for(resource)
  else
    clean_up_passwords resource
    respond_with resource
  end
end

在我的控制器中写这个的最好方法是什么?下面的代码是最简洁的方式,还是有办法进一步精简?

类 RegistrationsController < 设计::RegistrationsController

def update
  self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
  prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)

  if resource.update_with_password(account_update_params)
    resource.special_method
    super
  else
    super
  end
end

编辑:所以我上面的示例代码不起作用,因为它依赖于 Devise::RegistrationsController 中的受保护方法。这又依赖于不同设计控制器中的另一种方法。如何在不覆盖原始控制器/帮助文件的情况下访问这些方法?

澄清,

  • 我的控制器有一个update方法,其中包含一个account_update_params方法。

  • Devise::RegistrationsController 有一个受保护的account_update_params方法,其中包括一个devise_parameter_sanitizer方法

  • Devise::Controllers::Helpers 有一个devise_parameter_sanitizer方法可以创建 Devise::ParameterSanitizer 和 Devise::BaseSanitizer 的新实例

有没有一种简单的方法可以访问这些方法,或者绕过将它们包含在我的代码中super

4

1 回答 1

1

您走在正确的道路上,您是否更新了路由文件以使用您的覆盖控制器?

devise_for :users, :controllers => {:registrations => "registrations"}

您的更新方法不能以您使用它的方式调用 super , super 将再次运行整个方法,而不仅仅是它所在的部分。您最好用基本方法的副本替换您的更新方法,然后插入您的新方法调用(基本上,取消注释您的评论!)

Devise 旨在以这种方式继承和修改,只要您正确路由,私有方法和助手就不应该给您带来任何痛苦。

于 2013-05-17T23:11:01.277 回答