Ruby on rails Rails对象是什么';扩展';支持的路径?

Ruby on rails Rails对象是什么';扩展';支持的路径?,ruby-on-rails,extend,Ruby On Rails,Extend,这让我一天半都很沮丧 我正在尝试从位于非典型位置的module.rb文件扩展我的模型。在我的模型中,我尝试根据模型中的属性扩展到模块。模型被传递给视图,我希望视图在所有情况下调用相同的模块方法(“内容”),而不管模型的路径属性如何 Test < ActiveRecord::Base ... after_initialization do |test| if !self.path.nil? if File.exists?('app/views/' + s

这让我一天半都很沮丧

我正在尝试从位于非典型位置的module.rb文件扩展我的模型。在我的模型中,我尝试根据模型中的属性扩展到模块。模型被传递给视图,我希望视图在所有情况下调用相同的模块方法(“内容”),而不管模型的路径属性如何

 Test < ActiveRecord::Base
   ...
   after_initialization do |test|
     if !self.path.nil?
       if File.exists?('app/views/' + self.path + '/_extend.rb')
         extend 'app/views/' + self.path + '/_extend'
       end
     end
   end
   ...
 end
Test
只是尝试从不同的文件动态添加一个类方法。我想尝试让事情有条理,这就是为什么我想用一个巨大的开关盒将我所有的模块方法塞进模型中


有什么建议吗?谢谢。

ruby的
extend
方法不适用于路径。您需要提供要扩展的模块。因此,您不应该存储
路径
,而应该存储某种类型的
类型
,您可以稍后使用它来获取要扩展的模块的引用。举个小例子:

module GuestBehavior
  def has_access?
    false
  end
end

module AdminBehavior
  def has_access?
    true
  end
end

class User < ActiveRecord::Base
  after_initialize :extend_behavior

  def extend_behavior
    return if kind.blank?
    behavior_module = "#{kind.capitalize}Behavior".constantize
    extend behavior_module
  end
end

admin = User.new(:kind => 'admin')
guest = User.new(:kind => 'guest')

admin.has_access? # => true
guest.has_access? # => false

您不需要在代码中放入任何
require
语句。当您访问
GuestBehavior
AdminBehavior
时,Rails将自动加载文件。(这就是
constantize
调用所做的)

这是。。。令人困惑,至少对我来说是这样。另外,为什么要使用视图层中的任何内容来扩展模型类?你确定这是一种分解功能的适当方式吗?忽略我没有在这里描绘整个画面的路径。我只是想通过一个存储在单独文件中的模块来扩展模型。它存储在一个单独的文件中,因为我想稍后创建一个生成器,它将整齐地生成_extend.rb和一些其他特定于模型类型的文件。(_config.erb和_view.erb)感谢您的热烈响应。这基本上就是我试图实现的,但我希望示例中的“行为”模块来自单独的模块文件。我希望避免使用“load”或“require”,或者编写一些神奇的代码来将加载的模块方法拉入我的模型,这样我就可以调用相同的方法,而不考虑类型。我想我要从.rb中扩展我的模型。很遗憾,因为我想编写一个生成器来简化模型的创建,以及一些额外的模型类型特定文件。(_config.erb和_view.erb)如果您对如何将模块从文件扩展到类有什么建议,我就接受。全局加载模型将是一件痛苦的事情,因为我必须对每个模块进行唯一的命名。(如果它们是从文件扩展而来,那么路径就必须是唯一的)@garlicman可能是一个初始值设定项。另外,您可以将任何目录自动加载到库的自动加载路径。@DaveNewton我考虑过这个问题,但我试图避免对模块的命名过于具体。如果使用初始值设定项,则必须单独/唯一地声明所有模块。我希望通过在模型的path属性中查找带有标准命名模块的名为file.rb的支架来识别要扩展的模块。如果你对如何在初始值设定中实现这一点有什么建议,我肯定会全神贯注!最后,我决定在Model.rb中填充模型的扩展模块。我无法将新模块自动生成到现有模块中,但这将并且确实有效。谢谢你的建议。
app/models/guest_behavior.rb
app/models/admin_behavior.rb