2016-07-06 4 views
0

私はレール4を使用しており、answer,、benefitsの属性を持つArticleモデルを持っています。保存前に属性のキーを補間する

私はbefore_saveメソッドを作成しようとしています。これは自動的に副作用と利点を調べ、サイト上の別の記事に対応するリンクを作成します。

2つの実質的に同一のメソッドを作成する代わりに、副作用と利点の2つを作成する代わりに、同じメソッドを使用して、属性が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 

私はまた、あなただけの属性の許可セットを許可していることを確認するために、コントローラに強い属性を使用してお勧めします。言った...なぜあなたはすべての単一の属性を通過し、専用属性がanswer呼び出された場合に何かをするん


OLD(私はこれがすべての属性で使用されることを知っていた前)

?属性を調べて答えを直接見ることに迷惑を掛けないのはなぜですか?

例:

私はどうもありがとうございました。..必要正確に何である
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! @タリー – Kathan

+0

ああクール右 - それは与えられたコードから明らかではなかった。喜んでそれを助けた:) –

+0

私は答えを受け入れる前にあなたのためのもう1つの質問...私はどのように属性に新しい値を割り当てることができますか? 'self.send(key)=" new value "'は動作しません。 – Kathan

関連する問題