2011-12-17 6 views
0

私はcontent_tag(:address) do....を使ってみて、その後、ブロック内のコンテンツを置く場合、それはちょうど私の<br />タグをエスケープしRails 3.1content_tagsを使用してこの混乱をクリーンアップするにはどうすればよいですか?

def site_address(site) 
    html = '<address>'  
    html += site.address1 if site.address1.present? 
    html += tag(:br) + site.address2 if site.address2.present? 
    html += tag(:br) + site.city + ', ' if site.city.present? 
    html += site.state.statecode if site.state.present? 
    html += ' ' + site.zipcode if site.zipcode.present? 
    html += '</address>' 

    html.html_safe 
end 

content_tagをクリーンアップすることができないよう、このヘルパーメソッドを持っています。

また、テーブルにはヌル値の束がある可能性があるので、多くのif.present?ロジックがあることに注意してください。

ありがとうございました

答えて

2

あなたはこのロジックを部分的に動かすと考えましたか?また、新しい#presenceメソッドを使用する必要があります。

まず、方法:

def site_address(site) 
    address = [ 
    site.address1.presence, 
    site.address2.presence 
    ].compact 

    location = "" 
    location << site.city << ", " if site.city.present? 
    location << site.state.statecode if site.state.present? 
    location << site.zipcode if site.zipcode.present? 

    render :partial => "shared/site_address", 
     :locals => { :address_lines => address, :location => location } 
end 

その後、部分:一般的に

<address> 
    <% address_lines.each do |line| %> 
    <%= line %><br> 
    <% end %> 
    <%= location %> 
</address> 

、ヘルパーにhtml_safeを使用すると、あなたの中にHTMLのロジックで船外に行くかもしれないヒントですテンプレートエンジンを使用することをお勧めします。静的コンテンツと動的コンテンツを、適切なデフォルトのXSS安全セマンティクスでより簡単に混在させることができます。

address1address2などは(私は、少なくとも、これはsite.stateについて真である疑いがある)実際にnilはなく、おそらく空の文字列であれば、あなたはまったくpresentを使用する必要はありません。ちょうどif site.stateと言って、それを1日と呼んでください。 presentpresenceの方法では、条件のために空の値をそのままnilのように扱います。

+0

ありがとうございます!私は存在方法についても知らなかった。 – cbmeeks

関連する問題