小编tfw*_*ght的帖子

has_many同时尊重factory_girl中的构建策略

情况

# Models
class User < ActiveRecord::Base
  has_many :items 
end 

class Items < ActiveRecord::Base
  belongs_to :user 
  validates_presence_of :user_id 
end 

# Factories
Factory.define(:user) do |u| 
  u.name "foo" 
end 

Factory.define(:user_with_items, :parent => :user) do |u| 
  u.items {|items| [items.association(:item), items.association(:item)]} 
end

Factory.define(:item) do |i| 
  i.color "red" 
end 

Factory.define(:item_with_user, :parent => :user) do |i| 
  i.association(:user) 
end
Run Code Online (Sandbox Code Playgroud)

问题

如果你运行@user = Factory(:user_with_items)然后@user.items包含两个项目.问题是项目与数据库中的用户无关.如果你重新加载关联,@user.items(true)那么你会得到一个空数组.我知道你可以手动构建它们或者自己创建辅助方法来构建对象图,但我想避免这种情况.

所以,我的问题是如何在尊重构建策略的同时在factory_girl中建立一个has_many关系?

ruby unit-testing ruby-on-rails factory-bot

20
推荐指数
3
解决办法
7392
查看次数

在Snow Leopard上安装一些宝石的错误 - libxml2

升级到Snow Leopard后,我发现安装一些宝石不再有效,包括webrat,mechanize等.每次我收到此错误:

checking for xmlParseDoc() in -lxml2... no
libxml2 is missing.  try 'port install libxml2' or 'yum install libxml2'
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.
Run Code Online (Sandbox Code Playgroud)

不,我没有尝试用macports安装它,因为几年前,当我发现我无法轻易降级/管理端口时,我放弃了macports.从那时起,我已经变得非常舒适地手工制作源头,这是我第一次遇到超出我的想法.我愿意被说服回到m​​acports,但只有在没有简单的解决方案的情况下我才会失踪.

似乎libxml2实际上并不存在,或许只是过时了?...

扩展输出

ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb
checking for iconv.h in /opt/local/include/,/opt/local/include/libxml2,/opt/local/include,/opt/local/include,/opt/local/include/libxml2,/usr/local/include,/usr/local/include/libxml2,/usr/local/include,/usr/local/include/libxml2,/usr/include,/usr/include/libxml2... yes
checking for libxml/parser.h in /opt/local/include/,/opt/local/include/libxml2,/opt/local/include,/opt/local/include,/opt/local/include/libxml2,/usr/local/include,/usr/local/include/libxml2,/usr/local/include,/usr/local/include/libxml2,/usr/include,/usr/include/libxml2... yes
checking for libxslt/xslt.h in /opt/local/include/,/opt/local/include/libxml2,/opt/local/include,/opt/local/include,/opt/local/include/libxml2,/usr/local/include,/usr/local/include/libxml2,/usr/local/include,/usr/local/include/libxml2,/usr/include,/usr/include/libxml2... yes …
Run Code Online (Sandbox Code Playgroud)

macos development-environment rubygems macports osx-snow-leopard

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

Rails可选的gem配置

如果您想使用gem进行开发/测试而不想强迫其他开发人员使用,您会怎么做?现在我有

begin
  require 'redgreen'
rescue LoadError
end
Run Code Online (Sandbox Code Playgroud)

in test_helper.rb和没有gem配置,但这似乎是一种笨拙的方法,虽然是功能性的.我想做类似以下的事情:

config.gem "redgreen", :optional => true
Run Code Online (Sandbox Code Playgroud)

还有其他建议吗?或者我应该只提供那些非常肤浅的宝石......?

编辑

为了清楚起见,我只讨论那些特定的宝石,比如redgreen,它们实际上并没有在功能代码中使用,而只是在编码过程中.除了避免条件要求之外,根本不需要提供这些.

rubygems ruby-on-rails

7
推荐指数
2
解决办法
2020
查看次数

factory_girl协会验证

我有一个问题,我有一个父模型Foo,其中has_many :barshas_many :bazes.最后,我也有一个连接模型BarBaz,其belongs_to :barbelongs_to :baz.我想验证所有bar_bazes,以便它的bar和baz都属于同一个foo.但我似乎无法找到一种方法来为这个模型定义一个有效的工厂.

Factory.define(:bar) do |bar|
  bar.association(:foo)
end

Factory.define(:baz) do |baz|
  bar.association(:foo)
end

Factory.define(:bar_baz) do |bar_baz|
  baz_bar.association(:foo)
  baz_bar.association(:bar)
  baz_bar.association(:baz)
end
Run Code Online (Sandbox Code Playgroud)

当我尝试创建后者时,我得到一个无效的记录错误,因为bar和baz factory_girl尝试关联它,每个都有自己的foo.我搞砸了吗?

ruby-on-rails factory-bot

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

总是使用responds_to?

到目前为止,我总是使用responds_to块指定操作响应的格式,如下所示:

responds_to do |format|
  format.js { render :json => @record }
end
Run Code Online (Sandbox Code Playgroud)

最近我意识到如果你只支持一种格式(如上例所示),你真的不需要那个块.将它留在或删除是最佳做法吗?

ruby-on-rails

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

通过JSON/AJAX更新HTML

自从我听说它以来,我一直在使用JSON来处理我的rails应用程序中的AJAX功能,因为使用RJS /呈现HTML"感觉"错误,因为它违反了MVC.我工作的第一个AJAX项目结果是20-30个控制器动作直接绑定到特定的UI行为,我的视图代码分布在控制器动作,部分和rjs文件上.使用JSON允许您在视图中保持视图特定代码,并且仅通过AJAX与视图不可知/ RESTful控制器操作进行对话以获取所需数据.

我从使用纯JSON中发现的一个难题是你必须通过JS"渲染"HTML,在AJAX的情况下,必须更新DOM重元素,这可能是一个真正的痛苦.我最终得到了很长的字符串构建代码

// ...ajax 
success: function(records){
  $(records).each(function(record){
    var html = ('<div id="blah">' + record.attr +
      etc +
    ')
  })
}
Run Code Online (Sandbox Code Playgroud)

其中等10-15行基于记录数据动态构建HTML.除了烦恼之外,对这种方法的更严重的回归是HTML结构的重复(在模板和JS中).*这种方法有更好的实践吗?

(我最终伸出手的动机是我现在的任务是更新HTML如此复杂,它需要两个嵌套的Ruby代码循环才能首先渲染.在Javascript中复制它似乎很疯狂.)

  • 我考虑过的一件事是直接从文件系统加载静态部分文件,但这似乎有点多.

javascript ajax jquery json ruby-on-rails

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