标签: ruby

通过factory_girl协会查找或创建记录

我有一个属于一个组的用户模型.组必须具有唯一的名称属性.用户工厂和组工厂定义为:

Factory.define :user do |f|
  f.association :group, :factory => :group
  # ...
end

Factory.define :group do |f|
  f.name "default"
end
Run Code Online (Sandbox Code Playgroud)

创建第一个用户时,也会创建一个新组.当我尝试创建第二个用户时,它失败了,因为它想要再次创建相同的组.

有没有办法告诉factory_girl关联方法首先查看现有记录?

注意:我确实尝试定义一个方法来处理这个,但后来我不能使用f.association.我希望能够在像这样的Cucumber场景中使用它:

Given the following user exists:
  | Email          | Group         |
  | test@email.com | Name: mygroup |
Run Code Online (Sandbox Code Playgroud)

这只有在工厂定义中使用关联时才有效.

ruby cucumber ruby-on-rails-3 factory-bot

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

如何在MiniTest中存根?

在我的测试中,我想为任何类的实例存根固定响应.

它可能看起来像:

Book.stubs(:title).any_instance().returns("War and Peace")
Run Code Online (Sandbox Code Playgroud)

然后,每当我打电话,@book.title它就会返回"战争与和平".

有没有办法在MiniTest中执行此操作?如果是的话,你能给我一个示例代码片段吗?

或者我需要像摩卡这样的东西?

MiniTest确实支持Mocks,但Mocks对于我需要的东西来说太过分了.

ruby stub minitest

60
推荐指数
7
解决办法
5万
查看次数

何时使用在Ruby中启动子进程的每种方法

1. ``Backtick

1. a)%x{}百分比X <Backtick的替代语法

  • 在parse.y中定义,请参阅讨论

2. system()

3. fork()

4. open()

4.A. IO.popen()<表现相同open()

4.B. open("|-")

  • 叉到管道

4.C. IO.popen("-")<表现相同open("|-")

5. Open3.popen3()

  • require 'open3'
  • stdlib Open3

6. PTY.spawn()

  • require 'pty'
  • stdlib PTY

7. Shell.transact()

  • require 'shell'
  • stdlib Shell

什么时候应该放弃一个更复杂的方法的可信赖的背叛?

编辑1. 非常感谢Avdi Grimm的帖子描述了每种方法的示例用法:#1(&gist); #2(&gist); #3.

他们是很好的资源来回答如何,但没有明确的组成来回答每个应该使用为什么,并因此恕我直言这个问题不完整的答案.

ruby performance standards subprocess coding-style

60
推荐指数
3
解决办法
8120
查看次数

仅在属性存在时验证属性(仅当用户填写时)

如果它们不是空的,我只需要验证一些属性.

例如,用户可以具有徽标.如果我们尝试加载它 - 验证应该有效.如果我们只是更新没有徽标的用户数据,则必须跳过验证.

我现在有:

表单可以选择两个文件.一个 - 徽标,第二个 - 头像.这两个属性都是User模型的一部分.在用户模型中,有一个验证:

validates_preference_of :logo_file_name, :message=>I18n.t("...")
validates_format_of :logo_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("...")
validates_preference_of :avatar_file_name, :message=>I18n.t("...")
validates_format_of :avatar_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("...")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果我们尝试创建没有选择徽标和头像的新用户,我们将会出现错误(我们的验证).我尝试了更改验证并添加":on =>:update",如下所示:

validates_preference_of :logo_file_name, :message=>I18n.t("..."), :on => :update
validates_format_of :logo_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("..."), :on => :update
validates_preference_of :avatar_file_name, :message=>I18n.t("..."), :on => :update
validates_format_of :avatar_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("..."), :on => :update
Run Code Online (Sandbox Code Playgroud)

现在我可以创建没有选择徽标和头像的用户,但如果我尝试编辑用户并尝试上传只有徽标 - 我有头像的验证错误.如果我选择文件的头像和徽标留空 - 我有徽标验证错误.

我如何运行验证ony我想要更改的属性?

ruby validation ruby-on-rails

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

允许公共连接到本地Ruby on Rails Development Server

我正在Windows机器上设置RoR开发环境.我想知道如何设置它,以便我的一些朋友可以访问Web服务器并监控进度?

在任何时间最多只能连接2或3个人.

ruby ruby-on-rails

60
推荐指数
4
解决办法
4万
查看次数

map,each和collect之间有什么区别?

在Ruby中,有没有的功能有什么区别each,mapcollect

ruby enumerable

60
推荐指数
2
解决办法
4万
查看次数

Mountain Lion rvm安装1.8.7 x11错误

更新到Mountain Lion后,我尝试安装1.8.7,然后出错了.找不到X11文件,我安装了Xquarkz,但没有任何改变.怎么了?

Fail to find [tclConfig.sh, tkConfig.sh]
Use MacOS X Frameworks.

Find Tcl/Tk libraries. Make tcltklib.so which is required by Ruby/Tk.
clang -I. -I../.. -I../../. -I../.././ext/tk -DHAVE_RB_SAFE_LEVEL -DHAVE_RB_HASH_LOOKUP -DHAVE_RB_PROC_NEW -DHAVE_RB_OBJ_TAINT -DHAVE_ST_PTR -DHAVE_ST_LEN -DRUBY_VERSION=\"1.8.7\" -DRUBY_RELEASE_DATE=\"2012-06-29\"  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -DWITH_TCL_ENABLE_THREAD=0 -fno-common -g -O2  -fno-common -pipe -fno-common   -c stubs.c
In file included from stubs.c:10:
/usr/include/tk.h:78:11: fatal error: 'X11/Xlib.h' file not found
#       include <X11/Xlib.h>
                ^
1 error generated.
make[1]: *** [stubs.o] Error 1
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)

ruby x11 rvm osx-mountain-lion

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

如何用Homebrew更新Ruby?

我想知道如何使用Homebrew 更新到最新的稳定版Ruby.我对使用RVM 感兴趣.谢谢.

ruby macos homebrew

60
推荐指数
4
解决办法
8万
查看次数

Rubocop 25线块尺寸和RSpec测试

典型的RSpec单元测试广泛使用嵌套的Ruby块,以便构造代码并利用DSL"魔力"将规范读取为BDD语句:

describe Foo do
  context "with a bar" do
    before :each do
      subject { Foo.new().add_bar }
    end

    it "looks like a baz" do
      expect # etc
Run Code Online (Sandbox Code Playgroud)

在理想规范中,每个示例可以相对较短且精确.然而,似乎通常将外部块增加到100行以上,因为RSpec结构以这种方式工作,并且不需要许多规范示例,每个示例可能具有几行特定设置,以获得describe块,即与所描述的主题的代码相同或更大.

Rubocop最近的一次升级带来了新的规则,即块不应超过25行.我不确定它的基本原理,因为它没有在Ruby样式指南中列出.我可以看到为什么它可能是一件好事,并添加到默认规则集.但是,在升级之后,我们的Rubocop测试会多次失败并显示消息tests/component_spec.rb:151:3: C: Block has too many lines. [68/25]

使用代码度量工具(如Rubocop),我喜欢使用"使用默认值,链接到样式指南,完成工作"的策略.(主要是因为辩论标签与空格和其他细节是浪费时间,IME 永远不会得到解决)这显然是不可能的,我们的两个核心数据质量工具不同意代码布局方法 - 或者至少我是如何解释结果的,我没有看到我们如何编写规范本质上有任何错误.

作为回应,我们只是将Rubocop块大小规则设置为高阈值.但这让我想知道 - 我错过了什么?RSpec是否使用了现在已经失去信誉的代码布局方法,以及我在RSpec测试中减少块大小的合理选择是什么?我可以看到重构代码以避免大块的方法,但它们毫无例外地纯粹是为了满足Rubocop规则的丑陋黑客,例如将所有块分解为辅助函数:

def looks_like_a_baz
  it "looks like a baz" do
         expect # etc
  end
end

def bar_context
  context "with a bar" do
    before :each do
      subject { Foo.new().add_bar }
    end …
Run Code Online (Sandbox Code Playgroud)

ruby rspec rubocop

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

在使用gem进行捆绑安装期间找不到带有可执行包(Gem :: GemNotFoundException)的gem bundler(> = 0.a)

我正在执行以下脚本:

gem install rdoc --no-document
gem install bundle
bundle
Run Code Online (Sandbox Code Playgroud)

输出:

+ gem install rdoc --no-document
Successfully installed rdoc-6.1.1
1 gem installed
+ gem install bundle
Successfully installed bundle-0.0.1
Parsing documentation for bundle-0.0.1
Done installing documentation for bundle after 2 seconds
1 gem installed
1 gem installed
+ bundle install
/usr/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
    from /usr/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
    from /srv/myuser/.gem/ruby/2.5.0/bin/bundle:23:in `<main>'
Run Code Online (Sandbox Code Playgroud)

我添加/srv/myuser/.gem/ruby/2.5.0/bin到我的路径,所以我能够安装宝石.

gem env节目

RubyGems Environment:
  - RUBYGEMS VERSION: 2.7.7 …
Run Code Online (Sandbox Code Playgroud)

ruby bundle rubygems ruby-on-rails bundler

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