2010-10-25 14 views
17

Chúng tôi đang làm một bản nâng cấp với Ruby on Rails 3 (như nửa trên thế giới ngay bây giờ), và tôi đã siêng năng thay thế tập quán của RAILS_ENV, ví dụThay thế Ruby on Rails đúng 3 cho ENV ["RAILS_ENV"] || = 'production'?

RAILS_ENV == 'wibble' 
# becomes 
Rails.env.wibble? 

Nhưng tôi không phải là nhất định phải làm gì với:

ENV["RAILS_ENV"] ||= 'production' 

Chúng tôi đã có nó ở phía trên cùng của một bó toàn bộ Rake nhiệm vụ và daemon, và ý tưởng là bạn có thể vượt qua RAILS_ENV trên dòng lệnh, nhưng nó mặc định là ' sản xuất 'nếu nó không được thông qua.

Tôi không chắc chắn về cách Rails3 thích hợp mới để thực hiện việc này. Vì vậy, bây giờ rails:upgrade:check tôi đang phàn nàn mãnh liệt của sự xâm nhập này của Rails2-ishness ...

Tôi không biết nếu:

::Rails.env ||= 'production' 

sẽ làm việc.

Rails.env tồn tại trong daemon không?

Liệu tự động có được điền trước bằng giá trị RAILS_ENV được truyền trên dòng lệnh hay chúng ta cần một cách mới để gọi các trình tiện ích không?

Câu thần chú chính xác cho điều này là gì?


Cập nhật:

Nhìn vào các mã nguồn cho Rails.env,

def env 
    @_env ||= ActiveSupport::StringInquirer.new(RAILS_ENV) 
end 

chúng ta có thể suy ra một số điều.

Thứ nhất, nó trông giống như RAILS_ENV không thực sự vẫn còn tồn tại - có nghĩa là nó có thể được thiết lập và Rails.env sẽ tìm thấy nó ...

Nếu Rails là hợp lệ trong bối cảnh của một daemon, sau đó không có gì khác cần phải được làm xong. Nếu không - sau đó tôi chỉ có thể không quan tâm nhiều và sử dụng cũ RAILS_ENV như trước.

Trả lời

11

Rails.env thực sự là loại ActiveSupport::StringInquirer, mà sẽ ghi đè method_missing để quy định rằng cú pháp bình đẳng tốt đẹp.Kiểm tra: http://api.rubyonrails.org/classes/ActiveSupport/StringInquirer.html

Vì vậy, nếu bạn muốn ghi đè lên nó được "sản xuất" bằng defaut, bạn nên viết:

Rails.env ||= ActiveSupport::StringInquirer.new('production') 

Tuy nhiên, bạn sẽ phải kiểm tra mà là giá trị chưa được khởi tạo của Rails.env, Tôi không chắc nó thực sự là nil.

Khóa học hành động tốt nhất, IMO, chỉ cần thêm env RAILS_ENV=production vào tất cả các tập lệnh của bạn.

+0

Ah - bây giờ điều này rất hữu ích, Vì vậy, "env (RAILS_ENV)" là cách bạn đặt thủ công và biến môi trường ngay bây giờ? –

+0

* g * chỉ cần nhìn vào mã nguồn cho Rails.env - bây giờ được thêm vào câu hỏi ... –

9

Sửa lib/tasks/environments.rake

# Sets environments as needed for rake tasks 
%w[development production staging].each do |env| 
    desc "Runs the following task in the #{env} environment" 
    task env do 
    Rails.env = env 
    end 
end 

task :testing do 
    Rake::Task["test"].invoke 
end 

task :dev do 
    Rake::Task["development"].invoke 
end 

task :prod do 
    Rake::Task["production"].invoke 
end 

Source

CẬP NHẬT

passRAILS_ENV=production qua dòng lệnh, một cái gì đó như thế này:

RAILS_ENV=production rake db:setup

Liệu this giúp đỡ:

# before 
if RAILS_ENV == 'production' 
    ... 

# Rails 3 
if Rails.env.production? 
+0

cập nhật ........ – zengr

+0

ok, Scuse sự thiếu hiểu biết của tôi, nhưng: 1) làm thế nào bạn sẽ sau đó gọi nhiệm vụ và 2) làm thế nào điều này sẽ ảnh hưởng đến daemon (mà trong trường hợp của chúng tôi không gọi qua cào) . –

+0

Oh ... và chỉ cần thông qua: 3) cách giải pháp này khớp với yêu cầu của chúng tôi để "mặc định sản xuất nếu không có gì được truyền trên dòng lệnh, nhưng ngược lại cho phép chúng tôi ghi đè lên" hàng" ? –

2
if Rails.env.production? 
    puts '...' 
+2

Tôi sợ bạn hiểu sai các yêu cầu. Tôi không muốn biết tôi có đang ở trong môi trường sản xuất hay không. Tôi muốn buộc các tập lệnh của mình chạy trong môi trường sản xuất theo mặc định. –

+0

Chỉ cần những gì tôi cần. – creativetechnologist