【问题标题】:How to make your own properties, eg. "devise :authenticable" in ruby / rails如何制作自己的属性,例如。 ruby / rails中的“设计:authenticable”
【发布时间】:2026-01-23 01:40:01
【问题描述】:

我想知道如何在我的模型中拥有各种属性。例如:

Property < ActiveRecord::Base
   locatable, saleable ...

这些会是混入吗?还是有另一种实现方式?例如。设计的方式有:

  class User < ActiveRecord::Base
    # Include default devise modules. Others available are:
    # :token_authenticatable, :confirmable,
    # :lockable, :timeoutable and :omniauthable
    devise :database_authenticatable, :registerable,
           :recoverable, :rememberable, :trackable, :validatable
  end

【问题讨论】:

  • 您需要创建一个自定义模块。 :lockable module 定义为 here

标签: ruby-on-rails ruby mixins


【解决方案1】:

关于开源内容的重要部分是您可以看看并找出答案。我删除了一些不相关的行(gems/devise-2.2.3/lib/devise/models.rb:83):

def devise(*modules)

  devise_modules_hook! do
    include Devise::Models::Authenticatable
    selected_modules.each do |m|
      mod = Devise::Models.const_get(m.to_s.classify)

      if mod.const_defined?("ClassMethods")
        class_mod = mod.const_get("ClassMethods")
        extend class_mod

        if class_mod.respond_to?(:available_configs)
          available_configs = class_mod.available_configs
          available_configs.each do |config|
            next unless options.key?(config)
            send(:"#{config}=", options.delete(config))
          end
        end
      end

      include mod
    end
  end
end

所有的设计都在做(除了做家务)是自动循环遍历你传入的 splatted 符号数组,并通过 Devise::Models::#{property_name} 将它们(或有时使用 extend)包含到你的类中。

您绝对可以这样做。应不应该取决于你在做什么。通常,仅看到 include SomeModule::SomeClass 就比 cutey 辅助方法提供的信息要多得多。

【讨论】: