2011-12-17 4 views
0

나는 내가 content_tag(:address) do....를 사용하려고하면 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으로 정리하고 다음 블록에 내용을 넣을 수없는 것,이 도우미 메서드를 가지고, 그냥 내 <br /> 태그를 이스케이프합니다.

표에는 Null 값이있을 수 있으므로 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 안전성이 뛰어난 좋은 의미로 더 쉽게 혼합 할 수 있습니다.

: 만약 address1, address2 등은 실제로 nil 있습니다, 그리고 아마도 빈 문자열 (나는 적어도이 site.state에 대한 사실 의심), 당신은 present을 전혀 사용할 필요가 없습니다 . if site.state라고 말하고 하루 만 부릅니다. presentpresence 메서드는 단순히 빈 값을 조건부 용도로 nil 인 것처럼 처리합니다.

+0

감사합니다. 나는 존재 방법에 대해서조차 몰랐다. – cbmeeks

관련 문제