2

我正在使用動態分派在繼承自ActiveResource的類中定義幾個類方法。更改動態方法中的實例變量(使用ActiveResource的動態資源)

class Invoice < ActiveResource::Base 
    self.site = 'http://localhost:8080/' 

    def self.define(method) 
    define_singleton_method(method) do |params = {}| 
     site = self.site 
     self.site = "#{self.site}/Invoice/#{method.to_s.camelize(:lower)}" 

     puts "self.site -> #{self.site}" 
     results = Invoice.all(params: params) 

     self.site = site 
     puts "changing self.site back to #{site}"  

     return results 
    end 
    end 

    define :get_details 
    define :put_approval 
    define :get_attachment 
    define :get_pending_notifications 
end 

這對於第一次調用,不管它是什麼(Invoice.get_details,Invoice.get_pending_notifications ...)的偉大工程,但始終未能在第二個呼叫。

我想了解爲什麼會發生這種情況,以及我可以如何解決問題。

回答

1

進一步研究這個,我發現,當我問它self.site實際上沒有改變。它告訴我它在日誌中正在改變,但它在於!在第一種方法中,self.site不會從其初始設置狀態更改。我有一個理論,爲什麼這不起作用,並找到解決辦法。

首先,我的理論:

當定義被稱爲類方法中的任何一個,site設置。由於site不在調用的類方法的範圍之內,因此一旦初始化它就不能在之後進行更改。

一個例子:

Invoice.get_details 

Invoice.site被初始設置爲 「localhost:8080 /發票/ getDetails」

Invoice.get_pending_notifications 

,因爲它已經被定義爲「本地主機Invoice.site不能改變:8080/Invoice/getDetails「

以上只是一個工作理論。

我如何得到這個工作:

刪除除了初始設置self.site = "localhost:8080"self.site所有引用,而使用URL字符串。 (根據部分「查找從定製路徑資源」在http://ofps.oreilly.com/titles/9780596521424/activeresource_id59243.html

class Invoice < ActiveResource::Base 
    self.site = "localhost:8080" 
    def self.define(method) 
    define_singleton_method(method) do |params = {}| 
     url = "#{self.site}/Invoice/#{method.to_s.camelize(:lower)}" 

     # results = Invoice.all(params: params) <- Change this call to below 
     results = Invoice.find(:all, from: url, params: params) 

     return results 
    end 
    end 

    define :get_details 
    define :put_approval 
    define :get_attachment 
    define :get_pending_notifications 
end 

使用上面的代碼中,我可以調用任何定義的方法中,每個指向不同的URL,沒有問題。

0

最有可能的網站沒有得到適當的重置。試試這個,它工作在Ruby控制檯:

class Invoice < ActiveResource::Base 
    self.site = 'http://localhost:8080/' 

    def self.define(method) 
    define_singleton_method(method) do |params = {}| 
     site = self.site 
     begin 
     self.site = "#{self.site}/Invoice/#{method.to_s.camelize(:lower)}" 
     Invoice.all(params: params) 
     ensure 
     # this code will always be run, even if there is an exception above 
     # and it won't affect the original value returned above 
     self.site = site 
     end 
    end 
    end 

    define :get_details 
    define :put_approval 
    define :get_attachment 
    define :get_pending_notifications 
end 
+0

我只是試過你有什麼,它似乎並沒有爲我工作。第二次調用時,我得到ActiveResource :: ForbiddenAccess或ActiveResource :: ServerError,具體取決於我首先調用的方法。 – Jeremiah