2017-09-25 14 views
0

私の特定の使用例は、後で実データで置き換えられるプレースホルダ値を持つHTML電子メールテンプレートを構築することです。Nokogiriを使用してHTMLプレースホルダタグを置き換える

例:プレースホルダが交換されたとき

hello <span class='placeholder' data-slug='contact.name'>contact.name</span> 

は... "こんにちはジョン" になります。

私はこれらのプレースホルダの50+を持っており、ライブデータでプレースホルダを置き換えるために鋸山を使用しています:

placeholder_mappings = { 
    "contact.name" => @contact.name, 
    "contact.email" => @contact.email, 
    ... 
} 

text = "hello <span class='placeholder' data-slug='contact.name'>contact.name</span>" 

page = Nokogiri::HTML(text) 

placeholder_mappings.each do |key, value| 
    page.css("[data-slug='#{key}']").each do |node| 
    node.replace(value) 
    end 
end 

page.to_html 

私は、HTMLタグを使用して代わりに{{contact.first_name}}のようなものだ理由は、私はCSSを追加することができますですテンプレートを作成するときにユーザーが簡単に見ることができるようにします。さもなければ、私はちょうどgsubを使用して、それを簡単にしたでしょう:)

上記のコードは機能しますが、非効率的です。私はNokogiriのドキュメントを見てきましたが、ノードの構文解析は非常に新しいものです。

これを実装するためのより効果的な方法がありますか、私が気付いていない私の問題のさらに良い解決策がありますか?

答えて

1

あなたのアプローチに基づいて入力します。あなたは、ハッシュplaceholder_mappingsを反復処理しないことにより、いくつかの改善を行い、代わりにキーに基づいて値を取得することができます。

node = page.at_css('span.placeholder') 
    node.replace(@placeholder_mappings[node['data-slug']]) 

at_css

page.css('span.placeholder').each do |node| 
    node.replace(@placeholder_mappings[node['data-slug']]) 
    end 

または使用は、あなたの現在のアプローチは、個別に各プレースホルダを処理することであるようです。

nodes = page.css('span.placeholder') 
    nodes.each do |node| 
    node.content = @placeholder_mappings[node['data-slug']] 
    end 
    nodes.remove_class("placeholder") 

ここでは、反復が困難になるため、ノード全体を置き換えるわけではありません。代わりに、コンテンツを置き換えて、最後に.placeholderを削除してCSSを削除します。

+0

私は、使用されたマッピングを参照することだけを考えなかったとは思いません!ほとんどのテンプレートでは10個程度の異なるプレースホルダしか使用されないため、これははるかに効果的です。ノードを削除しないという点に関しては、 'span'タグを残して' class'だけを削除すると、その電子メールクライアントが 'hello 'という生の文字列を件名に表示してしまうという問題があります。 –

関連する問題