# 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关系?
升级到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.从那时起,我已经变得非常舒适地手工制作源头,这是我第一次遇到超出我的想法.我愿意被说服回到macports,但只有在没有简单的解决方案的情况下我才会失踪.
似乎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
如果您想使用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,它们实际上并没有在功能代码中使用,而只是在编码过程中.除了避免条件要求之外,根本不需要提供这些.
我有一个问题,我有一个父模型Foo,其中has_many :bars和has_many :bazes.最后,我也有一个连接模型BarBaz,其belongs_to :bar和belongs_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.我搞砸了吗?
到目前为止,我总是使用responds_to块指定操作响应的格式,如下所示:
responds_to do |format|
format.js { render :json => @record }
end
Run Code Online (Sandbox Code Playgroud)
最近我意识到如果你只支持一种格式(如上例所示),你真的不需要那个块.将它留在或删除是最佳做法吗?
自从我听说它以来,我一直在使用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中复制它似乎很疯狂.)
factory-bot ×2
rubygems ×2
ajax ×1
javascript ×1
jquery ×1
json ×1
macos ×1
macports ×1
ruby ×1
unit-testing ×1