2014-02-27 45 views
0

有無論如何創建一個函數,我可以在模型和控制器都調用?我有一個函數抓取一系列文件並關閉擴展,並希望根據列表進行驗證。但是我也想在控制器中訪問這個列表,這樣我就可以輸出選項的選擇框。我目前有這個,但VALID_MODULES不會一直填充。Rails創建一個方法可以通過模型和控制器

class Job < ActiveRecord::Base 

    after_initialize :init 
    VALID_MODULES =[]; 

    validates :name, presence: true 
    validates :desc, presence: true 
    validates :api, presence: true, :inclusion => { :in => VALID_MODULES} 
    validates :filters, presence: true 
    validates :toe, presence: true 

    def init 
    Dir.foreach('lib/resources') do |item| 
     next if item == '.' or item == '..' or item == 'resource.rb' 
      #Wont be called very often so O(n) complexity is fine (small #elements) 
      VALID_MODULES.push(item[0..-4]) unless VALID_MODULES.include?(item[0..-4]) 
    end 
    end 

end 
+0

幾件事情。 1)這些模塊是否特定於Job類?他們是否特定於工作實例?或者它們對於應用程序來說是全局的2)你也不想在初始化時執行這個功能,因爲這將會從你從數據庫中提取的每條記錄執行,並且將會非常昂貴。這些問題的答案會影響正確的解決方案。 –

+0

Peter,valid_modules對應用程序來說真的是全球性的。是的,我認爲這是我能夠使用這些值作爲驗證並能夠在控制器中訪問它的唯一方法。 –

回答

1

而不是使用一個常數(VALID_MODULES),儘量讓它成爲您job的屬性。

class Job < ActiveRecord::Base 

    attr_accessor :valid_modules 
    after_initialize :init 


    validates :name, presence: true 
    validates :desc, presence: true 
    validates :api, presence: true, :inclusion => { :in => VALID_MODULES} 
    validates :filters, presence: true 
    validates :toe, presence: true 

    def init 
    @valid_modules ||= [] 
    Dir.foreach('lib/resources') do |item| 
     next if ['.', '..', 'resource.rb'].include?(item) 
     #Wont be called very often so O(n) complexity is fine (small #elements) 
     @valid_modules << item[0..-4] unless @valid_modules.include?(item[0..-4]) 
    end 
    end 

end 

現在在你的控制器,你可以叫你valid_modules對象Job上返回數組。 實施例:

job = Job.new 
job.valid_modules 
0
# in config/initializers/api_modules.rb 
module ApiModules 
    def self.modules 
    # the Dir[""] glob syntax here I believe exclude dot directories 
    # but I still like the Array#include? syntax here for your exclusions list 
    # you may need to massage the strings of your file list to be more appropriate to your case 
    @modules ||= Dir["lib/*"].select{|f| !["resource.rb"].include?(f) } 
    end 
end 

#app/models/job.rb 
validates :api, presence: true, :inclusion => { :in => ApiModules.modules} 
+0

這就是我將如何寫它至少。 ValidModules對用例有點不重要。從你的代碼看來,工作需要保存一個有效的api模塊,爲什麼不把它叫做ApiModule? :) –

相關問題