Rails Devise模型不会使用自定义模型控制器?

时间:2014-02-19 18:11:20

标签: ruby-on-rails ruby devise controller override

在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,它会将其打印到控制台。

1 个答案:

答案 0 :(得分:1)

我同意扎克的看法。继承自Devise::SessionsController的控制器绝对不应被称为UserController。最多,该控制器应该继承自Devise::RegistrationsController。此外,Rails的惯例规定您以复数形式UsersController命名控制器。无论如何,这就是您的代码无效的原因:

当您致电super时,已达到Devise::SessionsController内的create操作。请注意,在该操作的最后一行中,如何调用respond_with方法。此方法负责呈现模板,生成响应。达到此行后,您的代码将无法运行。

您有2个选项:

  1. 在致电super之前调用您的自定义代码:

    def create
      puts "this works"
      super
    end
    
  2. 或者利用Devise的create行动这一事实:

    yield resource if block_given?
    

    然后,您可以像这样调用自定义代码:

    def create
      super do |resource|
        puts "this works"
      end
    end
    

    Devise's readme中提到了这一点。

  3. 在第二个选项中,Devise正在使用两个非常棒的Ruby功能:块和屈服。您可以使用RubyMonk了解有关块和产量的更多信息,我强烈推荐它!