访问其他类的变量

我在上一篇文章( rspec测试中的未定义方法 )上得到了一些很好的帮助,但我只是想寻求更多的帮助。

我有一个rspec集成规范,我基本上需要更改代码以获得所需的结果。 我不能改变规范,因为它是练习的一部分。

let(:user) { User.new(voucher) } context 'no voucher' do let(:voucher) { nil } it 'should bill default price all the time' do user.bill expect(user.orders[0].billed_for).to eql 6.95 ... ... end end context 'vouchers' do describe 'default vouchers' do let(:voucher) { Voucher.create(:default, credit: 15) } it 'should not bill user if has a remaining credit' do user.bill expect(user.orders[0].billed_for).to eql 0.0 ... ... end end 

我放了一些点只是为了剪掉不必要的代码。

我非常了解这里发生了什么。

正在创建一个新的用户类,并将其设置为:user in let。 然后根据上下文启动凭证并传递凭证。 没有为第一次测试设置优惠券。 一个是第二个。

这是我的问题开始的地方

 require 'order' require 'voucher' class User attr_accessor :voucher, :orders def initialize(orders = [], voucher = nil) @voucher = voucher @orders = [orders] end def bill new_order = Order.new(self) @orders << new_order end end 

该方法已初始化。 它有可选参数。 我有点不清楚初始化是如何工作的,因为我无法在任何地方访问这些设置变量。

我对范围限制有点不确定,因为我希望从订单类中访问一些优惠券变量,目前看起来像这样

 class Order DEFAULT_PRICE = 6.95 attr_accessor :user def initialize(user) @user = user end def billed_for price = DEFAULT_PRICE user.orders.each do |order| price - order.billed_for end price end end 

shoudl访问用户凭证类就像user.voucher一样简单。 ??

也是一个较小的问题。 我目前正在使用工厂方法,因此凭证类可以自行初始化。

  def self.create(type, *attrs) 

* attrs参数本质上是一个数组。 我可以遍历这个并通过检查它们的存在将它绑定到一些预期的变量。 即如果数组具有某个键,则将该键的值设置为变量。 这是最好的方式还是有另一种流行的方式?

我知道这有很多要问,但我发现自己真的很困惑,如果有人能清除我的任何内容,我将不胜感激。 谢谢。

对于User类,您可以访问voucher并对变量进行attr_accessor ,因为它们是实例变量,并且由于顶部的attr_accessor而可公开访问。

对于您的工厂问题,我推荐来自Yetbot的FactoryGirl,它可以很容易地构建Factory对象。 您还可以使用Rails 灯具 ,它们是您创建的静态数据。

事实certificate我正在以错误的顺序初始化变量。 这意味着我在寻找错误class级的物品。

令人尴尬的noob错误! 它更好:)