2011-09-22 10 views
6

मेरे वेबपैप को अपने सत्र डेटा को एन्क्रिप्ट करने की आवश्यकता है। मैं जो सेटअप करता हूं वह है:रेल 3.1: केवल वेब ऐप (रेल सर्वर/यूनिकॉर्न/आदि) के लिए प्रारंभकर्ता को कैसे चलाएं

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 

यह सब अच्छा काम करता है, और सत्र डेटा सुरक्षित रखता है। यहां समस्या है: जब मैं अपने कस्टम रेक कार्यों को चलाता हूं तो यह प्रारंभकर्ता लोड करता है और सभी सत्रों को साफ़ करता है। अच्छा नही!

यह सुनिश्चित करने के लिए कि मैं केवल वेबपैप प्रारंभिकरण के लिए चलता हूं, मेरे प्रारंभकर्ता में क्या रख सकता हूं? या, मैं अपने प्रारंभकर्ता में रेक रेक कार्यों के लिए इसे चलाने के लिए क्या रख सकता हूं?

अद्यतन: ठीक है, मैंने इस पल के लिए क्या किया है MYAPP_IN_RAKE = true unless defined? MYAPP_IN_RAKE मेरी .rake फ़ाइल में जोड़ें। और फिर मेरे प्रारंभकर्ता में मैं करता हूं:

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

काम करने लगता है। लेकिन मैं अन्य सुझावों के लिए खुला हूं।

+0

यह भविष्य में अन्य तरीकों से आप काटने के लिए उत्तरदायी है। जब भी सर्वर पुनरारंभ होता है, तो आप अपने सभी सत्रों को खोने जा रहे हैं (जो कि इच्छित व्यवहार प्रतीत होता है), लेकिन इसमें सर्वर बहुत अधिक मेमोरी का उपयोग कर ऑटोकॉल्ड हो रहा है, जिसमें अनुरोध बहुत लंबा चल रहा है, आदि –

+0

I डाउनसाइड्स को समझें, लेकिन मुझे लगता है कि यह इसके लायक है। ऐप रीसेटिंग सत्र को पुनरारंभ किया जा रहा है: स्वीकार्य। बहुत अधिक स्मृति या अनुरोध का बहुत लंबा? यूनिकॉर्न के तहत इन परिस्थितियों को केवल कार्यकर्ता प्रक्रिया में ही होना चाहिए। और चूंकि मैंने 'preload_app = true' सेट किया है, प्रारंभिक केवल मास्टर में होता है। तो यूनिकॉर्न पुन: प्रारंभ करने के बिना श्रमिकों को राहत दे सकता है। – sbutler

+0

संभावित रेल डुप्लिकेट [रेल 3 प्रारंभकर्ता जो केवल \ 'रेल सर्वर \" पर चलते हैं और \ 'रेल उत्पन्न नहीं होते हैं, आदि] (http://stackoverflow.com/questions/8660019/rails-3-initializers-that- रन-इन-ऑन-रेल-सर्वर-और-नहीं-रेल-जेनरेट-ई) – davmac

उत्तर

8

आप `config/application.rb 'इस तरह से अपने आवेदन करने के लिए एक संशोधन कर सकता है:

module MyApp 
    def self.rake? 
    [email protected] 
    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 का प्रोग्राम प्रकृति आप महत्वपूर्ण लचीलापन मिलता।

+0

ठीक है, मुझे यह पसंद है। मैंने सेटर को '@rake = !! मान में तब तक बदल दिया है जब तक परिभाषित न हो? यह सुनिश्चित करने के लिए @ रेक 'है कि यह केवल एक बार सेट है। फिर मैंने पर्यावरण में भी जोड़ा। आरबी 'MyApp.rake = false'।ध्वनि उचित है? – sbutler

+0

आप इसे केवल एक बार स्थापित करने की चिंता क्यों करेंगे? डुप्लिकेट सेट को अनदेखा करने की तुलना में बेहतर अभ्यास एक अपवाद फेंकने के लिए कम से कम एक चेतावनी, या बेहतर उत्सर्जित करना है ताकि आप समस्या के स्रोत को ट्रैक कर सकें। – tadman

+0

मुझे लगता है कि मुझे चिंता है कि वेबएप कोड के रूप में चलते समय किसी भी तरह से रेकैकाइल लोड हो जाएगी। मैं समरूप रूप से सोच रहा हूं: रेक के रूप में, वेबपैप पर्यावरण लोड हो गया है, इसलिए मुझे उस मामले को भी संभालना चाहिए जहां वेबपैप के रूप में, रेक लोड हो जाता है। – sbutler

2

लगभग एक और काम है:

unless ENV["RAILS_ENV"].nil? || ENV["RAILS_ENV"] == 'test' 

आप रेक अपने ENV [ "RAILS_ENV"] के साथ शुरू करते हैं तब शून्य हो जाएगा। 'Test' के लिए परीक्षण rspec का उपयोग करते समय चलाने से बचने के लिए है।

मुझे पता है कि Rails.env का उपयोग करने के लिए गणना है लेकिन यह प्रारंभ होने पर "विकास" वापस आती है।

http://apidock.com/rails/Rails/env/class

# File railties/lib/rails.rb, line 55 
def env 
    @_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"] 
    || ENV["RACK_ENV"] || "development") 
end 
+0

धन्यवाद! मुझे जिस चीज की जरूरत थी! –

संबंधित मुद्दे