小编Mik*_*yth的帖子

RSpec stubbed方法可以按顺序返回不同的值吗?

我有一个模型Family,location它有一个合并location其他对象的成员的方法,成员.(成员与家庭有关,但这在这里并不重要.)

例如,给定

  • member_1有location=='圣地亚哥(旅游,5月15日返回)'
  • member_2有location=='圣地亚哥'

Family.location可能会返回'圣地亚哥(member_1旅行,5月15日返回)'细节不重要.

为了简化Family.location的测试,我想要存根Member.location.但是,我需要它返回两个不同的(指定的)值,如上例所示.理想情况下,这些将基于属性member,但只是在序列中返回不同的值就可以了.在RSpec有办法做到这一点吗?

可以在每个测试示例中覆盖Member.location方法,例如

it "when residence is the same" do 
  class Member
    def location
      return {:residence=>'Home', :work=>'his_work'} if self.male?
      return {:residence=>'Home', :work=>'her_work'}
    end
  end
  @family.location[:residence].should == 'Home'
end
Run Code Online (Sandbox Code Playgroud)

但我怀疑这是好习惯.在任何情况下,当RSpec运行一系列示例时,它不会恢复原始类,因此这种覆盖"毒药"后续示例.

那么,有没有办法让stubbed方法在每次调用时返回不同的指定值?

testing rspec ruby-on-rails stub

66
推荐指数
3
解决办法
3万
查看次数

Rails 3.0中的默认验证错误消息在哪里?

Rails 3.0中的默认验证错误消息在哪里?例如,ActiveRecord :: Error.default_error_messages [:take]的等价物是什么?我发现ActiveModel处理错误而不是ActiveRecord,但我自己找不到错误.

validation ruby-on-rails activemodel ruby-on-rails-3

17
推荐指数
1
解决办法
7312
查看次数

Ruby/Rails:重新打开与覆盖类

我想在Rails模型中添加一个方法,用于测试.如果我这样做

class Model
  def something_new
    do_something
  end
end
Run Code Online (Sandbox Code Playgroud)

在Rails控制台或运行时加载的文件中,模型被覆盖而不是修改.如果我v = Model.class在上面的行之前添加了一些内容,则新方法将成功添加到现有类中.显然需要参考来表示正在重新打开现有的类.

另一方面,可以添加一个方法,比如Fixnum,而不必先引用它.这里发生了什么,以及确保重新打开和修改现有类而不是被覆盖的常用方法是什么?

谢谢.

ruby namespaces ruby-on-rails class

12
推荐指数
2
解决办法
7525
查看次数

子类化核心Ruby类,如Hash

我需要一个类似Hash的类,但不一定需要所有的Hash方法.我已经读过像Hash那样继承核心类并不是一个好主意.无论这是否属实,做这种事情的最佳做法是什么?

# (a) subclass Hash, add new methods and instance variables
class Book < Hash
   def reindex
     @index = .....
   end
end

# (b) create a new class from scratch, containing a hash, 
#    and define needed methods for the contained hash
class Book
  def initialize(hash)
    @data = hash
  end 
  def []=(k,v)
    @data[k] = v
  end
  # etc....
  def reindex
    @index = ....
  end

# (c) like (b) but using method_missing

# (d) like (b) but using delegation
Run Code Online (Sandbox Code Playgroud)

我意识到Ruby有多种方法可以完成给定的任务,但是在相对简单的情况下,是否有任何一般规则可以解决上述哪种方法?

ruby hash duck-typing subclassing

8
推荐指数
1
解决办法
3667
查看次数

R中的引用调用(使用函数修改对象)

我只是在R中弄湿了,并且惊讶地看到一个函数没有修改一个对象,至少它似乎是默认的.例如,我写了一个函数只是为了在表中的一个标签上粘贴一个星号; 它在函数内部工作,但表本身不会更改.(我主要来自Ruby)

那么,使用函数来改变R中对象的正常,可接受的方式是什么?如何在表格标题中添加星号?

  • 替换整个对象: myTable = title.asterisk(myTable)

  • 使用解决方法通过引用进行调用(例如,在TszKin Julian的R中通过引用调用中所描述的?

  • 使用函数以外的一些结构?对象方法?

r function

5
推荐指数
2
解决办法
7547
查看次数

如何设置播种的Rake任务

(这实际上是一个关于Rake&Rails和依赖关系的新手问题.试着把我们的所有这些放在一起)

基本上,我想要一个像seed.rb一样的Rake任务,但是需要单独调用.它为开发环境添加了测试数据,而我的seed.rb为所有环境提供了基本数据.

脚本family_seed.rb使用FactoryGirl生成一些记录.它看起来像这样:

require File.expand_path('../../config/environment', __FILE__)
require './spec/factories'

Family.delete_all
Member.delete_all
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
Run Code Online (Sandbox Code Playgroud)

它运行良好bundle exec "ruby db/family_seeds.rb",但我的问题是如何使用Rake进行设置.整个事情应该放在Rake任务中吗?相反,我怎样才能设置一个可以调用脚本的任务,同时确保Rails开发环境在运行时可用?我不只是想完成工作,而是以"正确"的方式完成工作.

rake ruby-on-rails seed rake-task

4
推荐指数
1
解决办法
3635
查看次数

Ruby中最好的做法是避免滥用赋值"="?

忘了x = y在Ruby中让x引用与y相同的对象,我被咬了几次.在Ruby术语中,我已经习惯了语言x = y.dup.忘掉这一点,y当我认为在作业的右侧是安全的时候,我无意中改变了.

我可以看到,x = y没有特殊原因避免简单的任务是有意义的,但同样的事情可能潜伏在其他地方,如

name = (person.last_name.blank? ? 'unknown' : person.last_name)
Run Code Online (Sandbox Code Playgroud)

以后name << title实际上会更改person.last_name而不仅仅是名称.

如果这也发生在你身上,你是如何学会避免它的?是否有某些红旗或图案需要寻找?你对每个作业都怀疑吗?你经常使用.dup吗?我不知道Ruby的用法是否会成为我的第二天性,所以任何有用的提示都会受到欢迎.

ruby variable-assignment dup equals-operator

3
推荐指数
1
解决办法
231
查看次数

使用Rails 3.0在ActiveScaffold中路由问题

我正在尝试使用Rails 3.0的ActiveScaffold,仍然试图让它工作.我收到了一个错误

No route matches {:active_scaffold=>true, :action=>"show_search", :controller=>"locations"}
Run Code Online (Sandbox Code Playgroud)

当我浏览到http:// localhost:3000/locations.我的routes.rb中有"resources:locations,:active_scaffold => true",但我不知道这是否是Rails 3.0的正确语法.

我从来没有使用过ActiveScaffold并且没有致力于它,所以另一个问题是是否有更好的替代品 - 或者这取决于安装的具体情况?

routing activescaffold ruby-on-rails-3

2
推荐指数
1
解决办法
1596
查看次数

Rails 3 AR:保存和更新方法不保存数据库中更改的属性而不保存内存中的对象?

考虑这种情况:

  1. butterfly = Butterfly.create(:color ='blue')
  2. Butterfly.update_all(:颜色= '红')

此时,正如预期的那样,butterfly(在内存中)为蓝色,而相应的数据库对象为红色.现在尝试更新数据库条目

  1. butterfly.update_attributes(:大小=> '大')

结果是size属性被更新但颜色不是.我们留下的情况是,即使在成功保存或update_attributes之后,数据库与内存中的对象不匹配.事实上,甚至butterfly.update_attribute(:color, 'blue')还不足以强制改变数据库!我认为强制的唯一方法是更改​​首先将属性更新为else(butterfly.update_attribute(:color,'anything')),然后将其更改回原始值.

这是事情应该是这样的吗?

activerecord ruby-on-rails-3

2
推荐指数
1
解决办法
2562
查看次数

Ruby:从模块中重新打开一个类

为什么这不起作用?

module XT
  puts Fixnum.class  # So we're sure to re-open the Fixnum class
  class Fixnum
    def hi
      puts "HI from module XT"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

在要求并加载模块后,该hi方法仍未添加到Fixnum中.如果我删除模块包装器,它可以工作.

ruby syntax structure class

1
推荐指数
1
解决办法
1150
查看次数

Rails 3中的Ruby 1.92:Array.length不等于Array.count的情况?

我的理解是,countlength应返回红宝石阵列相同的号码.所以我无法弄清楚这里发生了什么(FactoryGirl设置为创建 - 保存到数据库 - 默认情况下):

f = Factory(:family)   # Also creates one dependent member
f.members.count   # => 1
f.members.length  # => 1
m = Factory(:member, :family=>f, :first_name=>'Sam') #Create a 2nd family member
f.members.count   # => 2
f.members.length  # => 1
puts f.members    # prints a single member, the one created in the first step
f.members.class   # => Array

f.reload
[ Now count == length = 2, and puts f.members prints both members]
Run Code Online (Sandbox Code Playgroud)

我模糊地理解为什么f需要重新加载,尽管我希望这f.members会涉及到成员的数据库查找family_id=f.id …

arrays activerecord count ruby-on-rails-3

0
推荐指数
1
解决办法
655
查看次数