回答

4

可以通過擴展method_missingrespond_to_missing?來將請求轉發到序列化數據。可以說你有你的序列號Hashdata。在這是一個包含序列化的數據比如,你可以使用這個代碼的類:

def method_missing(method_name, *arguments, &block) # forewards the arguments to the correct methods 
    if method_name.to_s =~ /data_(.+)\=/ 
    key = method_name.to_s.match(/data_(.+)=/)[1] 
    self.send('data_setter=', key, arguments.first) 
    elsif method_name.to_s =~ /data_(.+)/ 
    key = method_name.to_s.match(/data_(.+)/)[1] 
    self.send('data_getter', column_number) 
    else 
    super 
    end 
end 

def respond_to_missing?(method_name, include_private = false) # prevents giving UndefinedMethod error 
    method_name.to_s.start_with?('data_') || super 
end 

def data_getter(key) 
    self.data[key.to_i] if self.data.kind_of?(Array) 
    self.data[key.to_sym] if self.data.kind_of?(Hash) 
end 

def data_setter(key, value) 
    self.data[key.to_i] = value if self.data.kind_of?(Array) 
    self.data[key.to_sym] = value if self.data.kind_of?(Hash) 
    value # the method returns value because best_in_place sets the returned value as text 
end 

現在,您可以訪問object.data:使用吸氣object.data_name和設定值使用的setter object.data_name [名] = 「測試」。但要使用best_in_place來實現此功能,您需要將其動態添加到attr_accessible列表中。要做到這一點,你需要改變mass_assignment_authorizer的行爲,使對象響應accessable_methods與應允許這樣被編輯方法名稱的數組:

def accessable_methods # returns a list of all the methods that are responded dynamicly 
    self.data.keys.map{|x| "data_#{x.to_s}".to_sym } 
end 

private 
    def mass_assignment_authorizer(user) # adds the list to the accessible list. 
    super + self.accessable_methods 
    end 

所以在視圖中,您可以現在打電話

best_in_place @object, :data_name 

要編輯的序列化的數據@ object.data [:名稱]

//也可以使用元素索引,而不是屬性名稱的數組做到這一點:

<% @object.data.count.times do |index| %> 
    <%= best_in_place @object, "data_#{index}".to_sym %> 
<% end %> 

您不需要更改其餘的代碼。

+0

謝謝你。那麼非關聯的Array/Hash呢?沒有密鑰的數組有可能有類似的東西嗎?這是我的問題:http://stackoverflow.com/questions/28415176/how-to-edit-a-serialized-array-with-unknown-keys 謝謝! –

+0

查看編輯添加了有關如何使用此數組的擴展 – davidb

+0

我還編輯了另一個源來處理散列和數組.... – davidb

相關問題