当然,问题是红宝石符号不喜欢连字符.所以这样的东西显然不会起作用:
content_tag(:div, "Some Text", :id => "foo", :data-data_attr => some_variable)
Run Code Online (Sandbox Code Playgroud)
一种选择是使用字符串而不是符号:
content_tag(:div, "Some Text", :id => "foo", 'data-data_attr' => some_variable)
Run Code Online (Sandbox Code Playgroud)
或者我可以插入:
"<div id='foo' data-data_attr='#{some_variable}'>Some Text</div>".html_safe
Run Code Online (Sandbox Code Playgroud)
我更喜欢后者,但两者看起来都有点粗糙.谁知道更好的方法?
我已经写了一段时间的测试,我开始掌握一切.但是我有一些关于测试覆盖率真正需要的问题.共识似乎很清楚:更多的报道总是更好.但是,至少从初学者的角度来看,我想知道这是否真的如此.
以这个完全香草控制器动作为例:
def create
@event = Event.new(params[:event])
if @event.save
flash[:notice] = "Event successfully created."
redirect_to events_path
else
render :action => 'new'
end
end
Run Code Online (Sandbox Code Playgroud)
只是生成的脚手架.我们这里没有做任何不寻常的事情.为什么为此操作编写控制器测试很重要?毕竟,我们甚至没有编写代码 - 生成器为我们完成了工作.除非rails中存在错误,否则此代码应该没问题.看起来测试这个动作与测试,例如collection_select并没有太大的不同 - 我们不会这样做.此外,假设我们使用黄瓜,我们应该已经涵盖了基础知识(例如重定向的地方).
对于简单的模型方法,甚至可以说同样的情况.例如:
def full_name
"#{first_name} #{last_name}"
end
Run Code Online (Sandbox Code Playgroud)
我们真的需要为这些简单的方法编写测试吗?如果出现语法错误,您将在页面刷新时捕获它.同样,只要你的功能点击任何调用full_name方法的页面,黄瓜就会捕获这个.显然,我们不应该依赖黄瓜来做任何过于复杂的事情.但是full_name真的需要单元测试吗?
您可能会说,因为代码很简单,测试也很简单.所以你不妨写一个测试,因为它只需要一分钟.但似乎写作基本上毫无价值的测试可能弊大于利.例如,它们使您的规格变得混乱,使得更难以专注于实际上重要的复杂测试.此外,他们需要时间来运行(虽然可能不多).
但是,就像我说的那样,我几乎不是专家测试员.我不一定主张减少测试覆盖率.相反,我正在寻找一些专家建议.是否真的有理由写这么简单的测试?
我有一个rake任务,该任务(除其他事项外)将生产数据库克隆到本地计算机,并将所有用户密码重置为password
(或其他)密码。
我当前的实现类似于:
User.find_each do |user|
user.password = 'password'
user.save
end
Run Code Online (Sandbox Code Playgroud)
那很好。但是现在我们有1000多个用户,它的运行速度相当缓慢,而且肯定会变得更糟。
编辑
好的。这是部分答案:
Devise.stretches = 1
User.find_each do |user|
user.password = 'password'
user.save
end
Devise.stretches = 10
Run Code Online (Sandbox Code Playgroud)
这使我的速度提高了5-10倍。与基于SQL的解决方案相比,它可能仍然很慢,但它仍然是一个非常不错的改进。这应该可以扩展到至少10,000个用户。
如果有时间,我可能仍然会纠缠于SQL解决方案。
我将这个问题待一会儿。如果其他人有更好的解决方案,请发布。
正如一些评论所建议的那样,最快的解决方案是通过SQL执行批量更新。现在,Devise允许您encrypted_password
直接设置:
sample_user = User.last
sample_user.password = "password"
encrypted_password = sample_user.encrypted_password
User.update_all(encrypted_password: encrypted_password)
Run Code Online (Sandbox Code Playgroud)
基本上,我们在单个用户上设置密码,然后可以使用他们encrypted_password
执行批量更新。该解决方案应该可以扩展到几乎任何数量的用户。
感谢@vladCovaliov在下面的评论中建议此解决方案。
我正在研究一个有很多相关模型的应用程序,并希望听到一些关于如何最好地组织控制器的意见.
以下是我一直在考虑的一些选项:
1)命名空间控制器.因此,例如,有一个控制器/管理目录和一个控制器/公共目录.这似乎对组织很有吸引力,但也因为单个资源通常可能具有明显属于不同目录的动作(例如,show动作是公共的而创建动作是admin).所以这意味着将我的一些资源分解为两个独立的控制器 - 一个公共管理员,一个管理员.看起来很糟糕.
2)创建嵌套资源.我只是偶尔使用嵌套资源,所以我不总是清楚什么时候最好嵌套资源而不是简单地通过params传递你需要的数据.有没有人有一些关于如何最好地使用嵌套资源的建议/示例?什么时候这是个好主意?什么时候是矫枉过正?
3)只留下默认的脚手架控制器.在需要时创建新的集合/成员操作,并在过滤器之前使用以在每个控制器中设置权限.这看起来最吸引人,因为它可以提前保持简单.但是,由于一些控制器可能会因为一些新的动作而开始膨胀,因此我对于线路变得混乱的事情感到紧张.
如果有任何有大型应用程序设计经验的人可以在这里提供一些指导,那就非常感谢.
我目前正在使用RSpec2,Cucumber和VCR(通过WebMock),一切都运行良好.
通常使用VCR记录所有请求,然后根据录制的磁带重放.
现在我想在某些情况下允许真正的Web请求:
@live
.对于这些测试 - 仅限这些测试 - 我想允许真正的Web请求.controllers ×1
cucumber ×1
devise ×1
html5 ×1
optimization ×1
rspec ×1
ruby ×1
testing ×1
vcr ×1