我目前正在尝试将一个非常古老的Rails 1.x插件转换为兼容Rails4的Gem。 我设法重写代码并使框架启动并运行,但测试当前失败并出现以下错误:
ActiveRecord :: RecordNotFound:无法找到所有包含' id'的页面: (首先,{:conditions => [" url_slug =?和parent_id IS NULL", "原始页面"]})(找到0结果,但正在寻找2)
我接受了相当多的工作,但抛出错误的代码位于此处:
acts_as_slugable_class.transaction do
while existing != nil
existing = acts_as_slugable_class.find(:first, conditions: ["#{slug_column} = ? and #{slug_scope_condition}", proposed_slug + suffix])
if existing
if suffix.empty?
suffix = "-0"
else
suffix.succ!
end
end
end
end
我使用ActiveRecord / Support的TestCase进行基本设置运行测试,并使用Sqlite运行内存数据库。 Database.yml文件:
test:
adapter: sqlite3
database: ":memory:"
当我在现有语句的末尾添加 rescue nil 时,除了唯一性检查外,所有测试都会通过。 这就是我的test_helper.rb文件:
# Configure Rails Environment
$:.unshift(File.dirname(__FILE__) + '/../lib')
ENV['RAILS_ENV'] = 'test'
require 'rails'
require 'rails/test_help'
require 'active_record'
require 'active_support'
require 'yaml'
require 'acts_as_slugable'
Rails.backtrace_cleaner.remove_silencers!
# Load support files
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
# Load fixtures from the engine
if ActiveSupport::TestCase.method_defined?(:fixture_path=)
ActiveSupport::TestCase.fixture_path = File.expand_path('../fixtures', __FILE__)
end
# run the database migrations
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
ActiveRecord::Base.establish_connection(config[ENV['RAILS_ENV']])
load(File.dirname(__FILE__) + '/schema.rb')
这有点像黑客攻击,但我也将源代码上传到了我的github。 如果有人想修补它并帮助我解决为什么没有任何东西进入数据库:
答案 0 :(得分:2)
如果我们试图让Rails4准备就绪,为什么会有旧的查找语法?
acts_as_slugable_class.transaction do
while existing != nil
existing = acts_as_slugable_class.where(["#{slug_column} = ? and #{slug_scope_condition}", proposed_slug + suffix]).first
if existing
if suffix.empty?
suffix = "-0"
else
suffix.succ!
end
end
end
end
如果找不到对象,这也应该正确返回nil(与find
相比,如果找不到某个东西会引发错误。)