【问题标题】:Controllers inside Rails engines (gems)Rails 引擎中的控制器(宝石)
【发布时间】:2015-10-25 22:00:42
【问题描述】:

我正在学习如何构建 Rails gem(更具体地说是引擎)。我首先阅读了一些现有的开源代码,例如 Devise,但我无法理解其中的控制器。在app/controllers 中有_devise_controller.rb_ 与模块层次结构

 class DeviseController < Devise.parent_controller.constantize

但在lib/devise/controllers/ 中也有许多具有模块层次结构的控制器

module Devise 
  module Controllers

这些控制器之间有什么区别(比如当我得到“users/sign_up”时调用的那个)?有更多使用 Devise 经验的人可以解释一下吗?

【问题讨论】:

    标签: ruby-on-rails devise rails-engines


    【解决方案1】:

    我假设 Devise 控制器位于它们自己的模块中,以免污染全局命名空间。例如,检查 this answer 中的案例,其中新类基于 Devise 的 RegistrationController

    class RegistrationsController < Devise::RegistrationsController
    

    如果它不在 Devise 中,则名称 RegistrationsController 将已被使用。

    app/controllers/devise 下的控制器是路由器将请求重定向到的实际控制器。 lib/devise/controllers 下的那些是控制器的助手,因此在模块 Devise::Controllers 中为方便起见。

    users/sign_up 被调用时,它被路由到_registrations_controller.rb:6_。这不是通过 routes.rb 以正常方式完成的,可能是因为 Devise 需要调整每个应用程序的 URL,因为您并不总是使用 users 作为路径。而是由devise/rails/routes.rb 完成,这是行

    mount_devise_token_auth_for 'User', at: 'auth'
    

    来自 routes.rb 的实际应用程序。

    【讨论】:

      【解决方案2】:

      我在gem I wrote some time back 中包含了控制器。

      使用命名空间的主要原因之一是因为你的整个 gem 应该在单个模块的胁迫下:

      #lib/exception_handler.rb
      module ExceptionHandler
      
          #Exception Handler
          class Exceptions < Rails::Engine
      

      这意味着如果您从 gem 中调用 controller(这意味着它是独立的),您通常必须在 inside中调用它> 模块:

      ExceptionHandler::ExceptionController.action(:show).call(env) }
      

      --

      在 Devise 的意义上,他们将控制器包含在命名空间中是有意义的,原因有两个:

      • 它允许他们从他们的模块中调用他们的控制器
      • 它们无需外部依赖即可包含控制器

      当我得到“users/sign_up”时调用它

      设计控制器可以被routes Devise sets分解:

       new_user_session     GET       /users/sign_in       {controller:"devise/sessions", action:"new"}
       user_session         POST      /users/sign_in       {controller:"devise/sessions", action:"create"}
       destroy_user_session DELETE   /users/sign_out       {controller:"devise/sessions", action:"destroy"}
      

      这些只是sessions 控制器(处理登录等)的路由。

      还有其他路由包括registrations

      这里的关键是要了解 Devise 必须“开箱即用”——否则大多数人不会使用它。它通过自包含其控制器来实现这一点,确保按照sanfor 的建议,它们不会发生冲突。

      如果您有更具体的要求,我很乐意为您解答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多