我有一个应用程序,我最近更新到Rails 3.2.1(来自Rails 3.0.x)并重构了JS和CSS资产以利用新的资产管道.该应用程序托管在Heroku上,带有Celadon Cedar堆栈.
我将特定于应用程序的配置保存在名为app_config.yml的YAML文件中,并使用初始化程序将其加载到全局APP_CONFIG变量中:
# config/initializers/load_app_config.rb
app_config_contents = YAML.load_file("#{Rails.root.to_s}/config/app_config.yml")
app_config_contents["default"] ||= {}
APP_CONFIG = app_config_contents["default"].merge(
app_config_contents[Rails.env] || {} ).symbolize_keys
Run Code Online (Sandbox Code Playgroud)
Heroku支持内置于Cedar堆栈的Rails资产管道.当您将应用程序推送到Heroku时,它会自动调用rake assets:precompile
服务器作为部署过程中的一个步骤.但是,它在没有数据库访问或正常ENV变量的沙盒环境中执行此操作.
如果允许应用程序在资产预编译期间正常初始化,则会尝试连接到数据库时发生错误.通过将以下内容添加到application.rb文件中可以轻松解决此问题:
# Do not load entire app when precompiling assets
config.assets.initialize_on_precompile = false
Run Code Online (Sandbox Code Playgroud)
当initialize_on_precompile = false
设置,没有在初始化的config/initializers/*
被运行.我遇到的问题是我需要APP_CONFIG变量在资产预编译期间可用.
如何load_app_config.rb
在不初始化整个应用程序的情况下在资产编译期间加载?我可以使用group
传递给Rails :: Application.initialize 的参数做些什么!?
heroku ruby-on-rails-3 ruby-on-rails-3.1 asset-pipeline ruby-on-rails-3.2
我在Rails中有一个交易模型,代表一个金融交易,将从信用卡中扣除.
创建事务时,它的状态为:new
.当我尝试解决费用(将在DelayedJob中发生)时,我将状态更新为:pending
.charge
如果状态不是,则将忽略任何后续调用:new
.
# Trigger a card to be charged
def charge_transaction
return unless status == :new
self.transaction do
self.delay.settle_credit_card
self.update_attribute(:status, :pending)
end
end
# Actually do the charging (in a delayed worker)
def settle_credit_card
# ... Interact with our payment gateway
end
Run Code Online (Sandbox Code Playgroud)
由于这是一个load_balanced Web应用程序,我想确保我们考虑并发性而不是创建重复费用(由于并发请求).我理解乐观锁定的好处,但在这种情况下,我不介意拥有这个关键区域,因为同时尝试收费(或以任何方式更新交易)应该是一个例外情况.
这是尝试使用悲观的行级锁定
# Trigger a card to be charged
def charge_transaction
# Obtain row-lock
self.with_lock do
self.reload # Reload once lock is obtained - necessary?
# Check …
Run Code Online (Sandbox Code Playgroud) concurrency activerecord locking delayed-job ruby-on-rails-3