【问题标题】:How to write a Devise extension (to use a custom datastore)如何编写设计扩展(使用自定义数据存储)
【发布时间】:2011-12-02 23:37:31
【问题描述】:

我想为 Devise 编写一个扩展,允许您使用 parse_resource 作为数据存储(而不是 ActiveRecord)。 parse_resource 是 Parse.com 的 REST api 的 Ruby 包装器。它的界面与 ActiveRecord 的几乎相同,并且是 ActiveModel 投诉的。因此,Devise 的扩展似乎不需要太多的非样板文件。

但是,我找不到任何教程。我所依赖的只是其他扩展的来源。从MongoMapper extension,我推测有两个主要部分:

  1. The generators(不是必需的)

    在这里你覆盖DeviseGenerator#(generate_model|inject_devise_content|replace_default_devise_orm) 方法。

  2. The "guts"(非常需要)

    我不太确定这里发生了什么。似乎有很多样板,带有一点自定义类型转换,并且在底部有一个声明,我们将使用这个扩展而不是默认的 ORM。

这就是全部吗?我错过了什么?谁能更详细地解释一下“胆量”中发生了什么?

是否有任何简单的 lint 测试可以运行以确保与 Devise 完全兼容?

【问题讨论】:

  • 你有没有创造过这个或找到替代品?

标签: ruby-on-rails ruby devise mongomapper


【解决方案1】:

我认为最好的方法是为解析资源编写一个orm_adapter 适配器。这是设计与各种形态融合的真正“胆量”。

它实际上非常简单,包括一个您可以使用的test suite。考虑到 parse_resource 与 activemodel 兼容,适配器应该像克隆 existing adapter 一样简单。

接下来,您需要挂钩 orm_adapter 进行设计,它只是其中一个files 的克隆。

【讨论】:

    【解决方案2】:

    作为一个好的开始,您可以查看couchDB 扩展和Riak 扩展。您可以在Hook module 中看到您覆盖了您想要/必须使设计工作的任何内容。

    你能看到底部的class_eval 声明吗?在那里,您使用Devise::Models 模块扩展类(在您的情况下为ParseResource::Base),该模块包含所有必要的方法(包括著名的devise 方法as you can see)和next Hooks 模块,如果你想覆盖任何东西(MongoMapper 扩展不需要覆盖任何东西,这就是为什么不使用这个方法)。因此你必须写:

    module Devise
      module Orm
        module ParseResource
          module Hooks
            # here you define any overrides
          end
        end
      end
    end
    
    ParseResource::Base.class_eval do
      extend Devise::Models
      extend Devise::Orm::ParseResource::Hooks
    end
    

    之后,您必须在 #{Rails.root}/config/initializers/devise.rb 初始化程序中使用 require 'devise/orm/parse_resource'(假设您已将文件命名为 parse_resource.rb)。希望我能有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2021-10-14
      • 2023-03-12
      • 2014-09-08
      • 2022-01-07
      相关资源
      最近更新 更多