2011-06-06 57 views
4

我正在使用ActiveModel,因爲我連接到第三方API而不是數據庫。我編寫了自己的初始化程序,以便可以傳入散列並將其轉換爲模型中的屬性 - 以支持應用程序中的某些表單。ActiveModel等同於ActiveRecord has_attribute?

attr_accessor :Id, :FirstName, :LastName,... 

def initialize(attributes = {}) 
    attributes.each do |name, value| 
    send("#{name}=", value) 
    end 
end 

的問題是,我想用同樣的模式來處理來自API的數據檢索,但這我真的不關心其他數據的加載。因此,我希望在遍歷API返回的哈希時檢查它,並檢查屬性是否存在於我的模型中,如果不存在,則忽略它。這應該允許我爲表單帖子和API返回的數據提供一致的模型。例如:

def initialize(attributes = {}) 
    attributes.each do |name, value| 
    if self.has_attribute?(name) 
     send("#{name}=", value) 
    end 
    end 
end 

我已經瀏覽了ActiveModel API文檔,但似乎沒有相應的內容。這讓我覺得我應該以不同的方式做這件事。

這是正確的(Rails)方式嗎?當數據來自不同來源時,如何確保我具有一致的模型屬性?

回答

4

基於上面的代碼示例,你並不需要在所有使用類似has_attribute?的方法加載ActiveModel - 你可以簡單地退回到純醇」紅寶石:

def initialize(attributes = {}) 
    attributes.each do |name, value| 
    send("#{name}=", value) if respond_to?("#{name}=") 
    end 
end 

這將只分配該屬性是否已由attr_accessor啓動。

+0

這太棒了,作品一種享受。謝謝你的幫助 :) – GrahamJRoy 2011-06-06 13:06:13