我正在齐心协力将我的头围绕着Rspec,以便更多地转向TDD/BDD开发模式.然而,我还有很长的路要走,并且在一些基本面上挣扎:
就像,我应该什么时候使用模拟/存根,什么时候不应该?
以这种情况为例:我有一个Site模型has_many :blogs和Blog模型has_many :articles.在我的Site模型中,我有一个回调过滤器,为每个新站点创建一组默认的博客和文章.我想测试那段代码,所以这里是:
describe Site, "when created" do
include SiteSpecHelper
before(:each) do
@site = Site.create valid_site_attributes
end
it "should have 2 blogs" do
@site.should have(2).blogs
end
it "should have 1 main blog article" do
@site.blogs.find_by_slug("main").should have(1).articles
end
it "should have 2 secondary blog articles" do
@site.blogs.find_by_slug("secondary").should have(2).articles
end
end
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行该测试,一切都会过去.然而,它也很慢,因为它为每一次测试创建一个新网站,两个新博客和三个新文章!所以我想知道,这是否适合使用存根?我们试一试:
describe Site, "when created" do
include SiteSpecHelper
before(:each) do
site = Site.new
@blog = Blog.new
@article = Article.new …Run Code Online (Sandbox Code Playgroud) 我正在使用Ruby on Rails构建一个应用程序,允许用户注册并创建自己的子域:
joebloggs.myapp.com
Run Code Online (Sandbox Code Playgroud)
因此,至少我需要一个通配符SSL证书来处理用户何时传递敏感数据(身份验证,支付等).
此外,我们允许想要将自己的域映射到其帐户的用户,例如:
www.joebloggs.com
Run Code Online (Sandbox Code Playgroud)
这突然间引起了巨大的麻烦.我假设没有SSL产品可用于此目的(即,可能在无限域上使用)?
该应用程序本质上是一个CMS,因此它有一个面向公众的网站和一个管理员后端.面向公众的网站方面必须具有映射到用户域的功能.但是,我不太关心管理区域,并且很乐意强迫用户通过他们的子域登录和管理他们的网站.
然而,虽然对于大多数网站而言用户是否登录并不重要,但我希望能够知道用户是否已登录,因此我可以为登录用户提供稍微不同的内容.我假设这会导致我出现问题,因为cookie不能用于多个域(或者可以吗?).我正在使用Authlogic进行身份验证.
真的,我只是想知道是否有人曾经遇到过这样的情况?如果是这样,你采取了什么方法来解决这里的几个问题?
我一直在构建一个执行会计功能的Rails应用程序.作为其中的一部分,我有一个带有类名的模型Transaction.到目前为止一直很好,我已经建立了这个功能一个月左右,一切都按预期工作.
到现在...
我刚刚发现一些使用Ruport库在几个月前开发的旧报告功能已停止工作.看来,Ruport在生成PDF时需要一个也有类/模块命名的库Transaction.
TypeError in Admin/team reportsController#generate
Transaction is not a module
...
This error occurred while loading the following files:
pdf/writer
transaction/simple
Run Code Online (Sandbox Code Playgroud)
所以,我正在寻找一个快速解决方案.一个希望不涉及重命名我的Transaction模型和重构最后几周的代码.
期待一些聪明的建议:)
在rails应用程序中,我有一个动作,返回不同模型集合的json表示.它看起来事情是这样的:
respond_to :json
def index
@cars = Car.all
@vans = Van.all
respond_with({
:cars => @cars,
:vans => @vans
})
end
Run Code Online (Sandbox Code Playgroud)
但是,我想自定义传递给json对象的属性和方法.有一点像:
respond_with({
:cars => @cars.to_json(:only => [:make, :model], :methods => [:full_name]),
:vans => @vans
})
Run Code Online (Sandbox Code Playgroud)
执行上述操作后,会将"cars"的json表示转义为一个大字符串,如:
{
"cars":"[{\"car\":{\"make\":\"Ford\" ... etc
"vans": [{"van":{"make":"Citreon" ... vans not escaped
}
Run Code Online (Sandbox Code Playgroud)
显然,我正以错误的方式接近这一点.谁能指出我正确的方向?
我有两个模型,有很多关系使用has_and_belongs_to_many.像这样:
class Competition < ActiveRecord::Base
has_and_belongs_to_many :teams
accepts_nested_attributes_for :teams
end
class Team < ActiveRecord::Base
has_and_belongs_to_many :competitions
accepts_nested_attributes_for :competitions
end
Run Code Online (Sandbox Code Playgroud)
如果我们假设我已经在数据库中创建了几个比赛,那么当我创建一个新的团队时,我想使用嵌套表单将新团队与任何相关的比赛相关联.
在这一点上,我确实需要帮助(已经坚持了好几个小时!)我认为我现有的代码已经以错误的方式解决了这个问题,但我会在以下情况下展示:
class TeamsController < ApplicationController
def new
@team = Team.new
@competitions.all
@competitions.size.times {@team.competitions.build}
end
def create
@team = Team.new params[:team]
if @team.save
# .. usual if logic on save
end
end
end
Run Code Online (Sandbox Code Playgroud)
并且观点......这是我真正陷入困境的地方所以我不会同时发布我的努力.我想要的是每个比赛的复选框列表,以便用户可以选择适当的比赛,并且不选择那些比赛.
我真的坚持这个,所以欣赏任何指向正确的方向,你可以提供:)
在Rails 2中,我们可以new为资源丰富的路由添加自定义操作,例如:
map.resources :users, :new => {:apply => :get}
Run Code Online (Sandbox Code Playgroud)
我们如何在Rails 3中实现同样的功能?
resources :users do
get :apply, :on => :new # does not work
new do
get :apply # also does not work
end
end
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个字符串,可以包含多个匹配(由百分比标记包围的任何单词)和一个替换数组 - 每个替换的键是正则表达式的匹配.有些代码可能会更好地解释......
$str = "PHP %foo% my %bar% in!";
$rep = array(
'foo' => 'does',
'bar' => 'head'
);
Run Code Online (Sandbox Code Playgroud)
期望的结果是:
$str = "PHP does my head in!"
Run Code Online (Sandbox Code Playgroud)
我尝试了以下,没有一个工作:
$res = preg_replace('/\%([a-z_]+)\%/', $rep[$1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['$1'], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep[\1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['\1'], $str);
Run Code Online (Sandbox Code Playgroud)
因此,我转向Stack Overflow寻求帮助.任何接受者?
本周末我一直在玩液体模板引擎,我想知道以下是否可行.
假设我latest_posts在Blog模型中有一个方法,我可以传递一个整数来获取最新的N个帖子.是否可以在液体模板中使用该方法?
例如:
class Blog
has_many :posts
def latest_posts(n)
posts.latest(n) # using a named scope
end
def to_liquid(*args)
{
'all_posts' => posts.all, # allows me to use {% for posts in blog.all_posts %}
'last_post' => post.last, # allows me to use {% assign recent = blog.last_post %}
'latest_posts' => posts.latest_posts(args[0]) # how do I pass variables to this?
}
end
end
Run Code Online (Sandbox Code Playgroud)
在上面的简单的例子,在我的液体模板,我可以使用blog.all_posts和blog.last_post,但不知道我会怎么做像什么blog.latest_posts: 10.
有人能指出我正确的方向吗?
我想到的一个想法是创建一个Liquid过滤器并将Blog对象和整数传递给它.就像是:
{% for post in blog …Run Code Online (Sandbox Code Playgroud) 给定一个像这样的对象数组:
objects = [
{ id: 'aaaa', description: 'foo' },
{ id: 'bbbb', description: 'bar' },
{ id: 'cccc', description: 'baz' }
];
Run Code Online (Sandbox Code Playgroud)
像这样的字符串数组:
order = [ 'bbbb', 'aaaa', 'cccc' ];
Run Code Online (Sandbox Code Playgroud)
我如何对第一个数组进行排序,以便id属性与第二个数组的顺序相匹配?
我正处于使用Rails 3构建应用程序的早期阶段.用户身份验证由Authlogic提供支持,我已将其设置为标准(根据示例文档),并且所有内容都按预期在本地运行.
我刚刚将应用程序部署到Centos 5.4/NginX/Passenger的干净服务器安装中,因此工作人员可以开始登录并输入内容等.但是,我们还有很长的路要走,因为我已经为公众的眼睛做好了准备,所以我使用过NginX的基本身份验证模块,使整个站点保持在另一级别的身份验证之后.
不幸的是,Authlogic的身份验证和NginX的基本身份验证似乎相互冲突.如果打开了基本身份验证,则无法使用Authlogic登录,但如果禁用基本身份验证,则Authlogic将按预期工作.
我没有发布任何代码,因为我真的不确定哪些代码是相关的.我想知道这是否是一个已知问题,如果有任何更改,我可以对配置进行更改以解决问题?
ruby ×5
activerecord ×1
arrays ×1
associations ×1
authlogic ×1
classname ×1
conflict ×1
javascript ×1
json ×1
liquid ×1
many-to-many ×1
mocking ×1
model ×1
nginx ×1
php ×1
preg-replace ×1
regex ×1
routing ×1
rspec ×1
ruport ×1
sorting ×1
ssl ×1
unit-testing ×1