我有一些用RSpec编写的规范测试各种模型.我使用Factory Girl生成测试对象.
现在最奇怪的事情发生了:
当我运行rspec spec/models/specific_model_spec.rb---这通过了该规范中的所有测试
但是,当我运行时rspec spec/models---此规范中的每个测试都无法引用创建的无效关联(通过工厂)
工厂创建的关联显然是有效的,因为运行测试也是隔离的.
什么可能导致这种行为?
更新:
与其他规范一起运行规范时出现的错误(每个失败的错误相同):
6) StreamItem adds a stream_item to a project and consultant when an engagement is added
Failure/Error: @project = Factory.create(:project, :name => 'bar' )
Validation failed: Customer is invalid
# ./spec/models/stream_item_spec.rb:44:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
在project factory以另一种规格测试,并通过细...
更新2: 使用的相关工厂代码如下:
Factory.define :manager, :class => User do |f|
f.sequence(:email) { |n| "bar#{n}@example.com" }
f.password "pass12"
f.sequence(:name) { |n| "Erwin#{n}" }
f.roles_mask 4
end
Factory.define …Run Code Online (Sandbox Code Playgroud) 我在Rails 3中有一个相当简单的问题,我似乎无法找到答案:
假设我有两个模型:客户,项目.
客户有很多项目
项目属于客户
现在我想使用Active Record按"客户名称"对项目列表进行排序(使用Ruby数组做这很容易,但我想一旦项目记录数量增加就会出现问题).
我如何使用ActiveRecord进行此操作?
我理解rails 3.1资产管道背后的原因:我们在一个整洁,可缓存的文件中编译所有JS以提高性能.我们想要的很棒.
但是,加载所有内容也意味着我们必须非常小心我们不要在多个页面上使用某个ID或类,如果我们附加了一些JS.否则,JS会在两个页面上触发,因为它总是被加载.
现在,我们想要实现的目标如下:
*我们希望将所有内容保存在单个JS文件中(我们知道如何单独加载文件,只是不希望这样)
*我们希望将JS命名为每个文件,controller_name.js以便它们仅在初始化适当的命名空间时加载
*我们希望通过从<body>布局标记上的数据属性读取当前控制器来初始化相应的命名空间
问题是:我们不知道如何在JS中实现.特别是,我们应该如何命名JS,然后根据HTML标记的内容动态初始化它.
任何帮助是极大的赞赏!
我:js => true在我的spec文件中标记了我的规格需要selenium .我想要实现的是,后卫将始终首先运行非:js规格,并且只有当这些规格全部通过运行标记的规格时:js.
这是我目前的Guardfile:
group 'non-javascript specs' do
guard 'rspec', cmd: 'zeus rspec --color --format nested --fail-fast -t ~js', parallel: false, bundler: false, :all_on_start => false, :all_after_pass => false, :keep_failed => false do
notification :terminal_notifier
watch(%r{^spec/.+_spec\.rb$})
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
watch('spec/spec_helper.rb') { "spec" }
# Rails example
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
watch(%r{^app/(.*)(\.erb|\.haml|\.jbuilder)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/features/#{m[1]}_spec.rb"] }
watch(%r{^spec/support/(.+)\.rb$}) { "spec" } …Run Code Online (Sandbox Code Playgroud) 我正在使用act_as_taggable_on在我们的项目中进行标记,以及用于搜索的sunspot/solr.
我们得到一个奇怪的意外结果.首先我们的设置(简短版):
模型:
Class Person
has_many :projects
searchable do
string :project_tags, :multiple => true do
projects.map { |p| p.tag_list}.flatten
end
end
Run Code Online (Sandbox Code Playgroud)
Taglist是act_as_taggable_on的一个方法,它为每个项目返回一个标签数组(fe ["foo","bar"]).我们为项目成员索引项目标签.
在我们的控制器中,当我们这样做时:
Person.search() do
with(:project_tags).any_of(params[:tags])
end
Run Code Online (Sandbox Code Playgroud)
这会让合适的人回归.到现在为止还挺好.
问题
我们希望能够搜索多个标签.因此,根据太阳黑子指令,我们传递一个数组.代码看起来大致如下:
@tags_array= params[:tags].split(/ /)
Person.search() do
with(:project_tags).any_of(@tags_array)
end
Run Code Online (Sandbox Code Playgroud)
现在,无论我们使用什么标签,太阳黑子都能为我们带来每个人!我们一直在控制台中测试这个疯狂,但无法理解我们哪里出错了.
任何帮助,将不胜感激!
欧文
我acts_as_taggable_on在我目前的Rails项目中使用.在一个概述页面上,我显示了一个带有相关标签的对象索引.我使用以下代码:
class Project < ActiveRecord::Base
acts_as_taggable_on :categories
end
class ProjectsController < ApplicationController
def index
@projects = Project.all
end
end
# in the view
<% @projects.each do |p| %>
<%= p.name %>
<% p.category_list.each do |t| %>
<%= t %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这一切都按预期工作.但是,如果我显示20个项目,acts_as_taggable_on则会触发20个查询以获取关联的标记.
如何在原始数据库查询中包含标记的加载?
谢谢你的时间.
我正在使用Sunspot生成很多我的应用程序索引和概述.
在这个应用程序中,我有2个模型,它们具有父/子一对多的关系.使用太阳黑子我索引父母拥有的孩子数量,因此可用于排序,范围等.
但是,当我更改子模型时,父模型不会自动重新编制索引(因为它没有更改).通过子节点上的call_back强制parent.save也不会强制索引.
所以在我开始乱砍之前:
当子模型被更改/添加时,在Sunspot中强制对父类执行索引操作的最佳方法是什么?
好的,我已经在我的rails应用程序中使用ajax很长一段时间了.不知何故,在我的第一个Rails 3.1应用程序中,我无法获得基础工作..
# application.js
//= require jquery
//= require jquery_ujs
# the form
= form_for @signup, :url => '/signup', :remote => true do |f|
= f.text_field :email, :class => 'email', :size => 26
= f.submit 'Notify me'
# the controller
def signup # route.rb has 'match '/signup' => 'controller#signup'
respond_to do |format|
format.js
end
end
# view: signup.js.erb
alert('wtf?');
Run Code Online (Sandbox Code Playgroud)
现在,据我所知,提交此表单应触发警告框.它没有.表单提交确实会进入控制器操作,该操作会渲染模板:
Rendered teaser_pages/signup.js.erb (0.1ms)
Completed 200 OK in 8ms (Views: 7.2ms | ActiveRecord: 0.0ms)
Run Code Online (Sandbox Code Playgroud)
只触发没有js.
虽然(我认为)UJS助手已经加载并运行,因为如果我这样做..
link_to 'click me', '#', :confirm …Run Code Online (Sandbox Code Playgroud) 在我们的应用中,人们有一个或多个项目.这些项目有开始和结束日期.人们的可用天数有限.
现在我们有一个页面,以逐周显示给定人员的可用性.它目前显示18周.
我们目前计算给定周的可用时间的方式如下:
def days_available(query_date=Date.today)
days_engaged = projects.current.where("start_date < ? AND finish_date > ?", query_date, query_date).sum(:days_on_project)
available = days_total - hours_engaged
end
Run Code Online (Sandbox Code Playgroud)
这意味着要显示应用程序上方描述的页面,将向数据库中触发18(!)个查询.我们有一些页面列出了表格中多人的可用性.对于这些页面,查询量很快就会变得惊人.
它也很慢.
我们如何以更高效的方式处理可用性检索?
我已经将wicked_pdf添加到我的rails应用程序中,其中包含自述文件后面的默认选项(偏差是我通过osx安装程序安装了wkhtmltopdf).
当我使用.pdf?debug = true选项渲染页面时,页面看起来应该完全正确.
然后,当我省略调试选项时,它会生成一个带有小版本页面的PDF.像1/16的大小.
我没有使用任何选项或配置.我哪里错了?我应该在哪里看?
我有一个非常简单的函数来将表示位串的3字符串转换为十进制数:
int bin3_to_dec(char *bin) {
int result;
result=0;
printf("string: %s\n", bin);
printf("c0: %c\n", bin[0]);
printf("c1: %c\n", bin[1]);
printf("c2: %c\n", bin[2]);
if ((strcmp(&bin[0], "1") == 0))
result += 4;
if ((strcmp(&bin[1], "1") == 0))
result += 2;
if ((strcmp(&bin[2], "1") == 0))
result += 1;
printf("result: %d\n", result);
return result;
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序并为此函数提供111它应该计算的字符串时7.而不是它输出:
string: 111
c0: 1
c1: 1
c2: 1
result: 1
Run Code Online (Sandbox Code Playgroud)
为什么不计算正确的值?为什么只有第三个条件顺利通过?
activerecord ×2
rspec ×2
sunspot ×2
c ×1
division ×1
factory-bot ×1
guard ×1
javascript ×1
jquery ×1
math ×1
performance ×1
rspec2 ×1
ruby ×1
sorting ×1
sql ×1
strcmp ×1
string ×1
testing ×1
ujs ×1
wicked-pdf ×1