2016-07-06 75 views
0

我使用的是Rails 4,並且有一個Article模型,它具有answer,side_effectsbenefits作爲屬性。在保存之前對屬性的鍵進行插值

我正在嘗試創建一個before_save方法,該方法會自動查看副作用和優點,並創建與該網站上另一篇文章相對應的鏈接。

而不是寫兩個幾乎相同的方法,一個用於副作用和一個好處,我想使用相同的方法並檢查以確保該屬性不等於answer

到目前爲止,我有這樣的事情:

before_save :link_to_article 

private 

def link_to_article 
    self.attributes.each do |key, value| 
    unless key == "answer" 
     linked_attrs = [] 
     self.key.split(';').each do |i| 
     a = Article.where('lower(specific) = ?', i.downcase.strip).first 
     if a && a.approved? 
      linked_attrs.push("<a href='/questions/#{a.slug}' target=_blank>#{i.strip}</a>") 
     else 
      linked_attrs.push(i.strip) 
     end 
     end 
     self.key = linked_attrs.join('; ') 
    end 
    end 
end 

但鏈上一樣,關鍵給了我一個undefined method 'key'

我該如何去插入屬性?

回答

1

在這個位:self.key你正在要求它從字面上調用一個名爲key的方法,但是你想要的是調用存儲在變量鍵中的方法名。

您可以使用:self.send(key)代替,但它可能有點危險。 如果有人在他們的瀏覽器上發佈了一個新表單,向您發送名爲delete!的屬性,那麼您不希望使用send意外調用該屬性,所以最好使用read_attributewrite_attribute。下面

例子:

def link_to_article 
    self.attributes.each do |key, value| 
    unless key == "answer" 
     linked_attrs = [] 
     self.read_attribute(key).split(';').each do |i| 
     a = Article.where('lower(specific) = ?', i.downcase.strip).first 
     if a && a.approved? 
      linked_attrs.push("<a href='/questions/#{a.slug}' target=_blank>#{i.strip}</a>") 
     else 
      linked_attrs.push(i.strip) 
     end 
     end 
     self.write_attribute(key, linked_attrs.join('; ')) 
    end 
    end 
end 

我也建議使用強屬性控制器,以確保你只允許允許的一組屬性。


OLD(之前,我知道這是要對所有屬性使用)

也就是說......爲什麼你經歷的每一個屬性,只有做一些事情,如果屬性稱爲answer?爲什麼不只是不去鑽研這些屬性並直接回答問題呢?

如:

def link_to_article 
    linked_attrs = [] 
    self.answer.split(';').each do |i| 
    a = Article.where('lower(specific) = ?', i.downcase.strip).first 
    if a && a.approved? 
     linked_attrs.push("<a href='/questions/#{a.slug}' target=_blank>#{i.strip}</a>") 
    else 
     linked_attrs.push(i.strip) 
    end 
    end 
    self.answer = linked_attrs.join('; ') 
end 
+1

這正是我需要的..非常感謝你。我想在除了答案之外的所有屬性上執行此方法...這就是爲什麼我正在循環。 Thx再次! @Taryn – Kathan

+0

啊很酷的權利 - 這是從給出的代碼不清楚。很高興幫助:) –

+0

在我接受答案之前,您還有一個問題需要解決......我如何爲這些屬性指定一個新值? 'self.send(key)=「新值」不起作用。 – Kathan

相關問題