【问题标题】:Where is the code that Devise generates?Devise 生成的代码在哪里?
【发布时间】:2015-10-08 04:45:37
【问题描述】:

我将 Devise gem 安装到我的 Rails 应用程序中,然后运行 ​​rails generate devise:installrails generate devise User

没有我做任何事情,网址users/sign_up 已经以某种方式获得了视图。问题是,我在任何地方都找不到正在渲染的模板。它肯定不在app/views/users 之下。我在页面上选择了一些文本并在我的应用程序中对其进行了搜索,得到了 0 个结果。

然后我尝试使用表单注册,并收到以下错误:

NoMethodError in Devise::RegistrationsController#create
undefined method `current_sign_in_ip' for #<User:xxxxxxxxxxx>

然后我搜索了这个控制器,但我的应用程序中没有 RegistrationsController,也没有设计文件。我要查找的文件也不是由我上面提到的两个命令生成的。

Devise documentation 似乎无法说明设计代码的保存位置

代码甚至在我的应用程序中吗?我很困惑。

【问题讨论】:

  • Devise“自动”生成的脚手架数量非常惊人,而且它的默默无闻最近让我们决定停止在工作中使用它。您可能想研究一些替代方案,例如 Sorcery 或 Clearance(用于简单的用户名和密码身份验证。)
  • @Drenmi 你用什么代替?
  • 现在我们正在使用 Sorcery,但它有自己的一套怪癖和陷阱。我知道一些开发人员支持推出自己的身份验证,但目前这对我们来说有点太极端了。 :-)

标签: ruby-on-rails ruby devise


【解决方案1】:

使用 Devise,您可以使用以下命令 generate the templates Devise 所依赖的登录、密码重置等:

rails generate devise:views

这将在您的 views 目录中创建 Devise 模板的副本。

对于控制器,您可以access/override their functionality 在您自己的代码中对它们进行子类化。它们位于Devise 命名空间下:

class NewRegistrationsController < Devise::RegistrationsController
  # do stuff here
end

然后让路由器使用这个新的控制器:

devise_for :users, controllers: { registrations: 'new_registrations' }

控制器的代码可以在 Devise 的 source code 中找到 - 您可以参考它以更好地了解每个控制器在做什么。

希望有帮助!

【讨论】:

  • 那么,如果我还没有生成模板,users/sign_up 是在我的应用程序外部使用 html 吗?这怎么可能?
  • Devise 作为 Rails 引擎运行,因此它的所有视图都封装在 gem 本身中。你可以看到他们here。该生成器命令会在您的视图目录中创建这些模板的副本,以便您可以随意访问/自定义它们。
  • 那么,如果我要创建自己的控制器 RegistrationsController &lt; Devise::RegistrationsController.... 会覆盖来自 gem 的代码吗?
  • 是的,如果您让我们说在您的新控制器中定义一个create 操作,使用您自己的自定义代码,那么将使用该代码而不是 Devise 的原始代码。您还可以使用super 保留控制器方法的功能并在其上扩展您自己的代码 - 设计文档涵盖了其中的一些here
  • 没问题!是的,对于像 Devise 这样固执己见的库,有时您必须弄脏自己的手才能提供覆盖并真正自定义行为 - 但我认为在身份验证方面,固执己见的库并不总是一件坏事: P
【解决方案2】:

这是 Rails "engines" 的标准做法(几乎所有的宝石都是)-

将它们视为libraries / dependencies...,其中它们通过几个挂钩(通常由 API 提供)提供对许多预编译功能的访问。


我实际上向write their own gem 推荐人们的原因之一是因为它可以帮助您了解整个事情的运作方式。 I wrote a gem, it uses views 就像设计一样:

这些视图在应用程序中看不到,因为它们在运行时附加到您的 Rails 应用程序。这基本上就是PATH var 在cmd 中的工作方式,如果您曾经有过使用程序编译等的乐趣的话。

因此,Devise 的“视图”存储在 Devise gem 中。这是附加到您的 Ruby 安装...[Ruby install dir]/lib/ruby/gems/[ver]/gems,在运行时加载就像 PATH var...

虽然您可以生成您的设计视图(如其他答案中所述),但这是它如何能够在没有任何事先参考的情况下访问它们的基线。


NoMethodError in Devise::RegistrationsController#create
undefined method `current_sign_in_ip' for #<User:xxxxxxxxxxx>

这意味着您的 Devise 安装没有 current_sign_in_ip 属性。我在这里专门回答了你的问题...... Devise error: undefined method `current_sign_in_ip'

【讨论】:

    【解决方案3】:

    所有设计 MVC 文件都在 gem 中。下面是我的设计视图目录。你也可以检查你的。转到您的项目根目录。

    gem show 'devise'
    /Users/saurabh/.rvm/gems/ruby-2.1.0/gems/devise-3.2.4
    cd /Users/saurabh/.rvm/gems/ruby-2.1.0/gems/devise-3.2.4/app/views
    

    如果您想自定义,您可以在项目中生成视图。

    rails generate devise:views
    

    【讨论】:

      【解决方案4】:

      所有设计代码都可以通过devise 轻松查看,如果您使用的是 ruby​​Mine,您可以在设计文件夹的外部库中查看设计代码。

      为您的模型生成模板

      rails generate devise:views
      

      然后您可以根据需要更改应用程序的视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 2021-03-29
        • 1970-01-01
        • 2018-06-19
        相关资源
        最近更新 更多