给定两个对象之间的标准has_many关系.举个简单的例子,我们来看看:
class Order < ActiveRecord::Base
has_many :line_items
end
class LineItem < ActiveRecord::Base
belongs_to :order
end
Run Code Online (Sandbox Code Playgroud)
我想要做的是生成带有存根行项目列表的存根订单.
FactoryGirl.define do
factory :line_item do
name 'An Item'
quantity 1
end
end
FactoryGirl.define do
factory :order do
ignore do
line_items_count 1
end
after(:stub) do |order, evaluator|
order.line_items = build_stubbed_list(:line_item, evaluator.line_items_count, :order => order)
end
end
end
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,因为Rails想要在分配line_items时调用order并且FactoryGirl引发异常:
RuntimeError: stubbed models are not allowed to access the database
那么你如何(或者可能)生成一个存根对象,其中has_may集合也是存根的?
我有2个RESTful Rails应用程序,我正试图互相交谈.两者都是用Rails 3编写的(目前是beta3).对服务的请求将需要使用api密钥,这只是每个请求都需要的参数.我似乎无法找到有关如何执行此操作的任何信息.
您可以通过site =方法定义资源连接到的URL.应该有一个等效的query_params =方法或类似的方法.
我找到了一篇与此相关的好博客文章,它是从2008年10月开始的,因此对Rails 3来说并不完全有用.
更新:我有一个想法.小型机架中间件或金属是否可以解决这个问题?它可以直接通过请求,将其添加到api_key上.
运行一些rake任务后会出现以下输出:
Loaded suite /usr/bin/rake
Started
Finished in 0.00042 seconds.
0 tests, 0 assertions, 0 failures, 0 errors
Run Code Online (Sandbox Code Playgroud)
对于与测试无关的任务,此输出无用或不必要.我想阻止它出现.我认为它源于需要某个文件或包含某个模块.
更新:看起来我错了,这确实在Rails内置的一些任务中出现.这是装载的灯具的输出--trace.
$ rake db:fixtures:load --trace
** Invoke db:fixtures:load (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:fixtures:load
Loaded suite /usr/bin/rake
Started
Finished in 0.000255 seconds.
0 tests, 0 assertions, 0 failures, 0 errors
Run Code Online (Sandbox Code Playgroud) 我正在使用github上找到的当前版本的restful_authentication,我遇到了一堆奇怪的会话问题.服务器似乎以某种方式将会话分配给不应该的用户.只有在越过已登出/登录的障碍时才会发生这种情况.
这是一个例子.随着服务器上的活动没有会话,我登录到与用户A在另一台计算机的帐户,我注销用户B的时候,注销重定向发生后的某个时间,我将被记录在与用户B登录然后用户A.从这一点开始,我可以继续浏览网站,就像我以该用户身份登录一样!我通过日志观察到的一点是,当发生这种劫持时,会话ID不一样.用户A在两个会话中都已登录,但会话ID完全不同.这只是可能发生的一个例子.我无法可靠地重现这个问题,因为它似乎是随机的.
它似乎不是环境或运行的服务器的症状.我可以使用杂种和乘客重现这个问题.我也在开发和生产中看到过它.我在这个应用程序中使用基于数据库的会话,它在Rails 2.1.1上运行.我在调用生成器时应用了有状态选项.否则,不会对会话的处理方式进行其他修改.
更新此处是直接来自restful_authentication的有问题的方法.
# Accesses the current user from the session.
# Future calls avoid the database because nil is not equal to false.
def current_user
@current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false
end
Run Code Online (Sandbox Code Playgroud) 我有一个Rails 2.3.5项目,它使用Rails的本地化功能.我也碰巧安装了Rails 3 beta(这取决于i18n gem).Rails 2.3.5很乐意自己处理本地化(没有安装i18n),但是如果i18n gem可用,它就会使用它.
最近我升级了我的宝石,现在安装了0.3.7和0.4.0的i18n.当然,Rails想要加载和使用导致我的项目出错的最新版本.我尝试将gem版本设置为0.3.7,这可以解决Web应用程序中的错误.但是,我们使用resque和resque_mailer来延迟发送消息.当工作人员从队列中获取邮件程序作业时,它会忽略environment.rb中的config.gem要求并使用版本0.4.0.
理想情况下,我想告诉Rails根本不使用i18n gem.我怎么做?
更新:从beta 4开始,Rails 3现在需要i18n版本0.4.1.我不知道有多少人没有遇到这个问题,因为现在看来如果安装了Rails 2和Rails 3,你就会遇到这个问题.
我有动态主动管理范围的问题.我试图在我的应用程序中为"项目"的每个"经理"创建一个范围.但是,在创建(或分配给项目)新管理器时,范围似乎不会更新,但如果我重新启动服务器,它们会更新.因此代码本身"有效",但显然不是我想要的方式.我是ruby/rails noob所以我不确定我是否需要做某些事情以某种方式"刷新"范围.
作为一个FYI,我在Heroku Cedar上使用Rails 3.2和ActiveAdmin
这是有问题的代码(有效但只在服务器重启后引入新的管理器):
Manager.find_each do |m|
scope m.first_name do |projects|
projects.where(:manager_id => m.id)
end
end
Run Code Online (Sandbox Code Playgroud)
以及整个Active Admin Project模型:
ActiveAdmin.register Project do
menu :priority => 1
index do
column :name
column :company_name
column :status
column :projection do |project|
number_to_currency project.projection
end
column :updated_at
default_actions
end
scope :all
scope :working, :default => true do |projects|
projects.where(:status => 'working')
end
Manager.find_each do |m|
scope m.first_name do |projects|
projects.where(:manager_id => m.id)
end
end
end
Run Code Online (Sandbox Code Playgroud)