草庐IT

ruby-on-rails - rails 3.1 : how to run an initializer only for the web app (rails server/unicorn/etc)

coder 2025-06-23 原文

我的网络应用需要加密其 session 数据。我设置的是:

config/initializers/encryptor.rb:

require 'openssl'
require 'myapp/encryptor'

MyApp::Encryptor.config[ :random_key ] = OpenSSL::Random.random_bytes( 128 )
Session.delete_all

app/models/session.rb:

require 'attr_encrypted'

class Session < ActiveRecord::Base
  attr_accessible :session_id, :data
  attr_encryptor :data, :key => proc { MyApp::Encryptor.config[ :random_key ] }, :marshal => true

  # Rest of model stuff
end

这一切都很好,并且保证了 session 数据的安全。问题在于:当我运行自定义 rake 任务时,它会加载初始化程序并清除所有 session 。不好!<​​>

我可以在我的初始化器中放入什么来确保它只在 webapp 初始化时运行?或者,我可以在我的初始化程序中放入什么以使其不为 rake 任务运行?

更新:好的,我目前所做的是添加 MYAPP_IN_RAKE = true unless defined? MYAPP_IN_RAKE 到我的 .rake 文件。然后在我的初始化程序中我做了:

unless defined?( MYAPP_IN_RAKE ) && MYAPP_IN_RAKE
    # Web only initialization
end

似乎有效。但我愿意接受其他建议。

最佳答案

您可以像这样在 `config/application.rb' 中修改您的应用程序:

module MyApp
  def self.rake?
    !!@rake
  end

  def self.rake=(value)
    @rake = !!value
  end

然后在您的 Rakefile 中添加:

MyApp.rake = true

最好使用方法而不是常量,因为有时您更愿意稍后更改或重新定义它们。另外,它们不会污染根命名空间。

这是一个示例 config/initializers/rake_environment_test.rb 脚本:

if (MyApp.rake?)
  puts "In rake"
else
  puts "Not in rake"
end

Rakefile 的可编程特性为您提供了极大的灵 active 。

关于ruby-on-rails - rails 3.1 : how to run an initializer only for the web app (rails server/unicorn/etc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7508170/

有关ruby-on-rails - rails 3.1 : how to run an initializer only for the web app (rails server/unicorn/etc)的更多相关文章

随机推荐