在Rails(版本4.0.2)中,我使用名为User的Devise gem(版本3.0.4)生成了一个简单的模型。我想自定义控制器。所以我创建了一个文件“user_controller”:
class UserController < Devise::SessionsController
def create
super
puts "this works"
end
end
以下是我的路线:
SecretApp::Application.routes.draw do
root 'static_pages#home'
match '/about', to: 'static_pages#about', via: 'get'
match '/profile', :to => "profile#show", via:'get'
devise_for :users, :controllers => {:registrations => "registrations", :sessions => "user"}
end
我假设在覆盖Devise控制器时,你必须在每个方法中调用super
,除非你完全覆盖了这个方法,对吗?在任何情况下,当我创建一个新用户时,控制台永远不会打印“这个工作”,所以我很确定控制器没有被使用。为什么呢?
puts "this is ok"
方法中有new
,它会将其打印到控制台。
答案 0 :(得分:1)
我同意扎克的看法。继承自Devise::SessionsController
的控制器绝对不应被称为UserController
。最多,该控制器应该继承自Devise::RegistrationsController
。此外,Rails的惯例规定您以复数形式UsersController
命名控制器。无论如何,这就是您的代码无效的原因:
当您致电super
时,已达到Devise::SessionsController
内的create
操作。请注意,在该操作的最后一行中,如何调用respond_with方法。此方法负责呈现模板,生成响应。达到此行后,您的代码将无法运行。
您有2个选项:
在致电super
之前调用您的自定义代码:
def create
puts "this works"
super
end
或者利用Devise的create
行动这一事实:
yield resource if block_given?
然后,您可以像这样调用自定义代码:
def create
super do |resource|
puts "this works"
end
end
Devise's readme中提到了这一点。
在第二个选项中,Devise正在使用两个非常棒的Ruby功能:块和屈服。您可以使用RubyMonk了解有关块和产量的更多信息,我强烈推荐它!