2011-03-04 13 views
5

Ruby on Rails 3 kullanıyorum ve denetleyicilere daha sonra erişilebilen @variable_name değişkenini ayarlamak için middlewar'leri kullanmaya çalışıyorum.Bir middleware'de tüm uygulamamda erişilebilen bir değişken nasıl ayarlanır?

Örneğin benim katman

class Auth 

    def initialize(app) 
     @app = app 
    end 

    def call(env) 
     @account ||= Account.find(1) 

     @app.call(env) 
    end 
    end 

düzgün @account değişkeni ayarlamak Yukarıdaki kod, ama bu (..., kontrolörler, modeller, görünümlerinde) benim uygulamada kullanılamaz. Yani, Bunu nasıl başarabilirim?


Neye ihtiyacım yapmanın bir yolu olduğunu this answer görülen

ama @account değişkeni "doğrudan erişilebilir" istiyorum. O kullanmadan, bu şekilde ancak böyle, benim görünümlerinde örneğin o kullanılabilir hale: Bu bir Middelware ile yapılabilir eğer bilmiyorum

<%= debug @account %> 
+1

Bunun Middleware'de yapılabileceğini sanmıyorum. 'Before_filter: set_my_var' ile' ApplicationController' içinde denediniz mi? – Wukerplank

+0

@Wukerplank Bir ara yazılımda buna ihtiyacım var. – user502052

+1

Kirli ve olası bir şeyleri 'Thread.current [: my_var] = Account.find (1) 'içinde saklamak gibi bir şey denemek isteyebilirsiniz. – Wukerplank

cevap

15

. Yani katman içinde bunu:

def call(env) 
    env['account'] = Account.find(1) 
    @app.call(env) 
end 

Sen uygulamanın 'talebi' kullanarak değeri elde edebilirsiniz:

request.env['account'] 

Ve küresel değişkenler kullanmak veya sınıf bazı insanlar olarak niteliklerini etmeyiniz burada öner. Kendinizi sıkıntılara sokmanın ve gerçekten kötü bir alışkanlık olmanın kesin bir yolu.

+0

İyi bir cevap için teşekkürler. Cevabınızdan hemen sonra omniauth'u hatırladım ve aynı uygulamayı kullandım.Ayrıca aynı şeyi rota kısıtlamasından (özellikle de veritabanımdaki taleplerin sayısının azaltılması için çok yararlı) yapabileceğinizi fark ettim. Request.env'e herhangi bir değeri iletebilir ve eylem içinde yakalayabilirsiniz. veya kontrolör. –

1

. Benim önerim bu olacaktır:

class ApplicationController < ActionController::Base 

    protect_from_forgery 

    before_filter :set_my_var 

private 
    def set_my_var 
    @account ||= Account.find(1) 
    end 

end 

tüm kontrolörler ve görünümler Bir cattr_accessor olabilir @account

+0

Bu yaklaşımla ilgili bir problem, ödev için orta yazılımın kendisinde bir şey hesaplamanızdır. – Ashish

-4

erişebilir Bu şekilde: my_var herhangi modelde ve

 
    MyModel.my_var = 'something' 
tarafından katman gelen bu değişkeni ayarlamak

Ve bunu uygulamada herhangi bir yere erişebilirsiniz.

+0

Ben iyi anlamadım. Gerçek bir örnek verebilir misiniz lütfen? – user502052

+0

model dosyasında bir yere "cattr_accessor: my_var" ekleyin. Bu, MyModel.my_var için bir ayarlayıcı ve getter yaratır: http://pastie.org/2345283 –

+1

Ana sorudaki yanıtı değil, çekirdek aracıdan bir denetleyici eylemlerine nasıl geçirileceğini bile değil. –

-5

Ruby global değişkeni oluşturmayı denediniz mi?

def call(env) 
    $account ||= Account.find(1) 

    @app.call(env) 
end 

ve

Bunun için 'env kullanabilirsiniz
<%= debug $account %> 
+1

100 olgunun 100'ünde global değişkenler cevap değildir. –

İlgili konular