2010-09-25 63 views
0

如果我們有一個名爲initialize的前置過濾器來初始化公共變量,那麼這些變量必須變成實例變量?有沒有其他的方法來做到這一點?在Ruby on Rails中,當使用before_filter時,局部變量需要變成實例變量嗎?

更新:這種情況是驗證一些URL參數,並設置它們。這曾經是一個動作,所以一切都可以使用局部變量來完成。但是現在,3個操作本質上採用相同的參數,所以代碼被移動到私有方法validate_params,並使用before_filter進行調用,但是這些局部變量似乎必須被製作爲實例變量。

它們可以不作爲實例變量嗎?由於模型的內置驗證,是否有驗證URL參數的框架/寶石?

+2

在過濾器'initialize'之前不要調用你的,因爲這是Ruby用來做其他事情的方法的名稱。用這個名字來調用你的方法很可能會阻止一些其他更重要的初始化完成 – Gareth 2010-09-25 00:16:26

+1

如果你想讓任何人回答你的問題,你還應該接受更多的答案。 – DJTripleThreat 2010-09-25 00:39:31

+0

誰降低了這個?似乎是一個完全有效的問題。僅僅因爲有人不接受答案(他們絕對應該這樣做)並不意味着他們的問題應該被降低,如果他們的話題是可以理解的話。 – 2010-09-25 00:44:35

回答

0

是否有替代方法?

究竟做什麼?如果你想要一個變量可用於控制器中的方法,那麼一個實例變量通常是合適的。如果你想有一個變量(或更可能是一個常量)可用於所有控制器或模型和視圖,還有其他技術可以實現這一點。我們需要更多關於具體要求的細節來弄清楚。

0

如果你想初始化時,你得到一個對象的新實例,你可以重寫初始化方法而不是使用回調變量:

class Special < ActiveRecord::Base 
    attr_accessor :sauce 

    def initialize(*args) 
    @sauce ||= 'tomato' 
    super(*args) 
    end 
end 

只是不要忘記調用super因爲ActiveRecords在初始化時做一堆其他的東西。