Tag: 模块

缺少Rails table_name_prefix

我有以下目录结构 models/foo/setting.rb models/foo.rb foo.rb内容 module Foo def self.table_name_prefix ‘foo_’ end end 和setting.rb内容 class Foo::Setting < ActiveRecord::Base end 一旦我调用Foo::Setting.find…我收到一个错误SQLException: no such table: settings确实是正确的,因为该表名为foo_settings所以rails似乎忽略为模块Foo指定的表前缀。 我可以做什么让rails考虑前缀?

Rails和RSpec – 测试关注类方法

我有以下(简化)Rails关注: module HasTerms extend ActiveSupport::Concern module ClassMethods def optional_agreement # Attributes #—————————————————————————- attr_accessible :agrees_to_terms end def required_agreement # Attributes #—————————————————————————- attr_accessible :agrees_to_terms # Validations #—————————————————————————- validates :agrees_to_terms, :acceptance => true, :allow_nil => :false, :on => :create end end end 我无法想出在RSpec中测试这个模块的好方法 – 如果我只创建一个虚拟类,当我尝试检查validation是否正常时,我会收到活动记录错误。 还有其他人遇到过这个问题吗?

一种从引擎到应用程序添加before_filter的方法

没有很多具体的代码,这只是模糊的,但我会提供我能做的。 给定一个rails引擎,一个基本的引擎而不是自己空间中的可安装引擎,如何将应用程序可用的引擎方法作为应用程序控制器的before_filter? 我一直在查看Devise代码,因为我想要的是与我对Devise的体验相似,但我承认我不理解我要经历的很多事情。 我可以这样做,如果我在应用程序控制器中include Myengine::Mymodule ,我希望有可用于过滤的方法,但我希望可以只使用这些方法而不必包含模块。 这是尝试将rails应用程序转换为多个rails应用程序使用的引擎的最新障碍,并且对获取正确命名空间,模块配置等的任何指导表示赞赏。

如何使用rspec检查变量是否是模块子类的实例?

我有一个类似于以下的类结构: module MyModule class MyOuterClass class MyInnerClass end end end 我正在尝试确保使用Rspec将变量正确实例化为MyInnerClass。 打印类的类型,它是MyModule :: MyOuterClass :: MyInnerClass。 但是,如果我尝试运行该行 expect{@instance_of_MyInnerClass}.to be_an_instance_of(MyModule::MyOuterClass::MyInnerClass) 我收到错误“你必须通过一个参数而不是一个块来使用提供的匹配器。” 此外,课程在另一个地方,所以我不能只检查 […] be_an_instance_of(MyInnerClass) Rspec抱怨MyInnerClass是一个未初始化的常量。 所以,我想问一下如何使用RSpecvalidation变量是否是MyInnerClass的实例。

命名空间和Mixins

我正在尝试清理我们的命名空间。 基本上我们的设置有点像 class myClass include myModule1 include myModule2 @important_var #critical instance variable 基本上@important_var是一个telnet处理程序,几乎所有方法都需要它。 这适用于它现在设置的方式。 不幸的是myModule1和myModule2变得越来越大。 所以我继续遇到方法的命名空间冲突。 我喜欢用模块包装器访问方法,例如: myClass_instance.myModule1.a_method 但我无法弄清楚如何做到这一点或其他更干净的名字间距的想法?

通过混合模块来覆盖类的实例方法

给定A类和模块B,混合B的实例方法,使其覆盖A的相应实例方法。 module B def method1 “B\#method1” end def method2 “B\#method2” end end class A def method1 “A\#method1” end def method2 “A\#method2” end # include B does not override instance methods! # (module gets mixed into the superclass) end puts A.new.method1 # want it to print out “B#method1” puts A.new.method2 # want it to print out […]

如何让ruby与一个类共享数据,并将其子类与extend结合使用

module M def f=(x) @f= x end def f @f end end class A extend M end class B < A end Af= 42 puts Af puts Bf 这会产生 42 nil @fa类变量是否为A和B? 如何仅通过将其写入M来共享A和B之间的变量?

类与模块方法的实例方法

我正在阅读Ruby的模块方法的这个解释,以及它们与类的实例方法的不同之处。 这是我正在阅读的解释: 请记住,与实例方法不同,需要在模块本身上定义模块方法。 你如何访问该模块? 回想一下,在模块定义中,self指的是被定义的模块。 因此,您需要使用self.xxxforms定义方法。 我不完全明白。 当我们在Classes中定义方法时,我们不必在类本身上定义它。 我们只是在类的实例化对象上调用它。 为什么我们需要使用术语“self”在模块本身上定义模块方法? 这是为了什么目的? 为什么我们不能在不使用术语self的情况下定义模块方法? 以下是我的模块框架的外观: module GameTurn def self.take_turn(player) end

模块内部控制器的规范(版本主义者)

我正在Rails中创建一个API,我使用versionist来处理版本。 我想测试API控制器,但我无法创建有效的请求。 我的控制器: class Api::V1::ItemsController < Api::V1::BaseController def index render json:'anything' end end 我的规格: describe Api::V1::ItemsController do describe “#create” do it “shows items” do get :index, format: :json end end end routes.rb中: scope ‘/api’ do api_version(:module => “Api::V1”, :path => {:value => “v1”}, :default => true) do resources :items end end 测试没有检查任何东西。 但是,它引发了一个错误: Failure/Error: get […]

模块如何解决常数的范围?

我一直在阅读这本Ruby书,然后就是这个我不太了解的例子: CONST = “outer” module Mod CONST = 1 def Mod.method1 # module method CONST + 1 end end module Mod::Inner def (Mod::Inner).method2 CONST + ” scope” end end Mod::CONST # => 1 Mod.method1 # => 2 Mod::Inner::method2 # => “outer scope” 您能否向我解释一下(详细说明),以便我完全理解该范围如何在Ruby中运行。 谢谢。