我试图通过创建一个共享示例组来保持我的规范DRY,该组对所有管理控制器(Admin我项目命名空间下的所有控制器)执行样板检查.我正在努力弄清楚如何去做,因为共享示例需要提供有关使用哪些操作和参数的信息.如果测试失败,理想情况下应该存在有意义的错误(即包括它正在测试的操作的细节).
require 'spec_helper'
shared_examples "an admin controller" do
before(:each) do
@non_admin = User.make
@admin = User.make(:admin)
end
context "as an admin user" do
@actions.each do |action, params|
specify "I should be able to access ##{action.last} via #{action.first}" do
self.active_user = @admin
send(action.first, action.last, params)
response.status.should be_ok
end
end
end
context "as a regular user" do
@actions.each do |action, params|
specify "I should be denied access to ##{action.last}" do
self.active_user = @non_admin
send(action.first, action.last, params)
response.status.should be 403
end …Run Code Online (Sandbox Code Playgroud) 我正在CAGradientLayer使用a 屏蔽a CAShapeLayer以生成位于表格中某些行内的书签.

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddLines(path,
NULL,
(CGPoint[]){
CGPointMake(8, 0),
CGPointMake(22, 0),
CGPointMake(22, 22),
CGPointMake(15, 16),
CGPointMake(8, 22)
},
5);
CGPathCloseSubpath(path);
CAShapeLayer *mask = [CAShapeLayer layer];
mask.fillColor = [UIColor redColor].CGColor;
mask.bounds = CGRectMake(0, 0, 30, 30);
mask.path = path;
mask.anchorPoint = CGPointMake(0, 0);
CGPathRelease(path);
CAGradientLayer *favoriteBadge = [CAGradientLayer layer];
favoriteBadge.colors =
@[(id)[UIColor colorWithRed:.97f green:0.5f blue:0.1f alpha:1.f].CGColor, // orange
(id)[UIColor colorWithRed:1.f green:.8f blue:0.f alpha:1.f].CGColor]; // yellow
favoriteBadge.locations = @[@0.0, @1.0];
favoriteBadge.bounds = CGRectMake(0, 0, 30, 30); …Run Code Online (Sandbox Code Playgroud) 在使用我的应用程序时,我偶然发现了一些代码中的竞争条件,这些代码使用在NSOperationQueue用户触发的事件之后异步运行任务.我知道如何修复竞争条件,因为这是一个愚蠢的设计错误,我不会深入研究,但我想用测试用例来证明这个错误(这样在进一步优化/重构时它就不会回来了)下线).这让我很难过.如何测试多线程的东西,特别是当测试的目的是产生竞争条件时?
在处理线程和单元测试时,有没有人可以参考我可以参考的参考资料?我对种族条件的产生特别感兴趣.
我们刚刚将虚拟机升级到我认为相同的ruby配置(通过RVM ...... Ruby 1.9.2,Rails 3.0.7,DataMapper 1.1.0).最大的区别是我们从MySQL 5.0到5.1.
出于某种原因,在我们的旧虚拟机上工作的完全相同的代码/ database.yml现在在我们尝试连接到数据库时的新代码上失败了.
问题是这个YAML:
mysql_defaults: &mysql_defaults
adapter: mysql
encoding: UTF-8
username: user
password: pass
host: localhost
development:
<<: *mysql_defaults
database: devdb
production:
<<: *mysql_defaults
database: productiondb
host: master.db.site.com
Run Code Online (Sandbox Code Playgroud)
只是扩展到:
"mysql_defaults" => {
"adapter"=>"mysql",
"encoding"=>"UTF-8",
"username"=>"user",
"password"=>"pass",
"host"=>"localhost"
},
"development" => {
"adapter"=>"mysql",
"encoding"=>"UTF-8",
"username"=>"user",
"password"=>"pass",
"host"=>"localhost"
},
"production" => {
"adapter"=>"mysql",
"encoding"=>"UTF-8",
"username"=>"user",
"password"=>"pass",
"host"=>"localhost"
}
Run Code Online (Sandbox Code Playgroud)
代替:
"mysql_defaults" => {
"adapter"=>"mysql",
"encoding"=>"UTF-8",
"username"=>"user",
"password"=>"pass",
"host"=>"localhost"
},
"development" => {
"adapter"=>"mysql",
"encoding"=>"UTF-8",
"username"=>"user",
"password"=>"pass",
"host"=>"localhost", …Run Code Online (Sandbox Code Playgroud) 使用Mail gem(即Rails + ActionMailer),是否有一种干净的方式来获取收件人的显示名称?
我可以通过以下方式获取地址:
mail.to.first
Run Code Online (Sandbox Code Playgroud)
我可以使用以下格式获取格式化的显示名称+地址:
mail.header_fields.select{ |f| f.name == "To" }.first.to_s
Run Code Online (Sandbox Code Playgroud)
但是我怎样才能得到显示名称部分(即在<和之前>).我知道有人会建议一个正则表达式,但这不是我想要的,因为我必须解析任何编码,这是Mail宝石可能已经做的事情.我是PHP中一个流行的Mailer库的作者,并且我知道在8位字符发挥作用时,在标题中假设前面的陷阱<并且>是人类可读的陷阱.
我可以做这个:
mail.header_fields.select{ |f| f.name == "To" }.first.parse.individual_recipients.first.display_name.text_value
Run Code Online (Sandbox Code Playgroud)
但必须有更好的方法吗?:)
我曾经使用的唯一一个支持这个的编辑器(我确定很多人都这样做)是Sublime Text 2,但希望emacs也有一个技巧.如果源保持列化,我工作的一些类具有相当声明的语法看起来更干净.当一个新行将列的长度增加一两个空格时,问题就出现了......然后你必须通过每一行来重新对齐它.
屏幕截图可能会澄清我的目标:

在这里我添加了一行,如果它的列比其他列延伸得更远,那么我想再次重新排列它.通常我只是在箭头和空格键周围重复循环,直到我逐行重新排列所有内容,但是如果有一种方法可以选择一个矩形区域并强制它会很好将该区域的非空白部分文本对齐.
这可能吗?
关于letcc这一点的一些问题在The Seasoned Schemer中使用.
(define (intersect-all sets)
(letcc hop
(letrec
((A (lambda (sets)
(cond
((null? (car sets)) (hop '())
((null? (cdr sets)) (car sets))
(else
(intersect (car sets)
(A (cdr sets)))))))
; definition of intersect removed for brevity
(cond
((null? sets) '())
(else (A sets))))))
Run Code Online (Sandbox Code Playgroud)
我想我明白什么letcc实现,那就是基本类似catch,并throw在红宝石(貌似CL),这基本上意味着代码的整体结构可以通过调用任何指定的剪短letcc的.这感觉就像是最"功能性"的事情我已经在这短短的系列丛书遇到,这让我觉得有点犹豫,使用它,因为我想学习的好功能的风格.我只是误解letcc,还是它不是一个真正的函数式编程概念,只是为了提高性能?整个想法,我可以在一些例程的中间,然后突然到达代码中的另一个点感觉有点错误...就像滥用Java中的try/catch程序流程一样.
letcc 似乎不存在于我在OS X中安装的guile版本(1.8.7).我应该在guile中寻找另一个名称吗?
如果我letcc通过将它与Java中的try/catch进行比较来误解,或者在ruby中捕获/抛出(这不是异常处理,只是为了清楚,对于非rubyists),它在功能级别上究竟是如何工作的?它可以用更长,更复杂的方式表达,这让我觉得它毕竟是功能性的吗?
我们有一个表格,它有一个独特的约束,用于从一个用户留下的反馈,另一个与销售相关的反馈.
ALTER TABLE feedback
ADD CONSTRAINT unique_user_subject_and_sale
UNIQUE (user_id, subject_id, sale_id)
Run Code Online (Sandbox Code Playgroud)
这可以确保我们不会意外地获得重复的反馈行.
目前,我们有时会硬错误地删除错误的反馈并让用户再次离开.我们想要更改为软删除:
ALTER TABLE feedback
ADD COLUMN deleted_at timestamptz
Run Code Online (Sandbox Code Playgroud)
如果deleted_at IS NOT NULL,考虑删除反馈,虽然我们仍然在我们的数据库中有审计跟踪(并且可能会向网站管理员显示幻像).
当我们使用像这样的软删除时,我们如何保持我们的唯一约束?是否可以在不使用更一般的CHECK()约束的情况下进行聚合检查(我从未尝试过使用像这样的检查约束).
这就像我需要在约束中附加一个WHERE子句.
ruby ×3
postgresql ×2
actionmailer ×1
c ×1
cocoa ×1
constraints ×1
datamapper ×1
emacs ×1
erlang ×1
indentation ×1
iphone ×1
libpq ×1
mail-gem ×1
objective-c ×1
rspec ×1
rspec2 ×1
scheme ×1
unit-testing ×1
yaml ×1