2008-09-25 5 views
8

헬퍼에 실제로 html이없는 것이 가장 좋다고 들었습니다. 내 질문은, 왜 안돼? 그리고 HTML 태그를 생성하려고한다면 실제 태그를 어떻게 피할 수 있습니까?도우미가 html을 사용하지 않아야하는 이유는 무엇입니까?

감사합니다.

-fREW

+0

* 한숨 *. 나는 실제로 많이 해왔다. 프레젠테이션 로직을 분리하는 것은 항상 좋은 생각이지만, 서둘러 서버 컨트롤과 도우미 클래스 및 다른 장소에서 HTML 태그를 통합했습니다. 적절하지 않았습니다. 나는 나쁜 사람입니다. ( – stephenbayer

답변

15

내 조언 - 작은 HTML 조각 (몇 개의 태그)이라면 걱정할 필요가 없습니다. 그보다 더 - 부분적인 부분에 대해서 생각해보십시오. (헬퍼에서 HTML 문자열을 함께 사용하는 것은보기가 좋을만큼 고통 스럽습니다.)

정기적으로 헬퍼에 HTML을 포함합니다 (직접 또는 link_to와 같은 Rails 메소드 호출을 통해). 내 세계가 내 주위에서 무너지는 것은 아닙니다. 사실 지금까지는 내 코드가 매우 깨끗하고 유지 보수 가능하며 이해할 수 있다고 말하기까지했습니다.

어젯밤에 나는 사용자 옆에있는 사용자 아이콘과 함께 일반 링크와 함께 html을 뱉어내는 link_to_user 헬퍼를 작성했습니다. 나는 부분적으로 할 수 있었지만, link_to_user는 그것을 다루는 훨씬 더 깨끗한 방법이라고 생각한다.

2

이 질문에 대한 전체 답변을하지 않습니다,하지만 당신은 content_tag 방법을 통해 태그의 HTML을 생성 할 수 있습니다. 내 생각으로는 코드의 청결성이 왜 될지에 대한 것입니다.

또한 content_tag를 사용하면 태그를 태그로 중첩 할 수 있습니다. 이 blog post on content_tag을 확인하십시오.

+0

Well 그 일은 할 수 있지만 실제로는 똑같은 일이며 여전히 매우 구체적인보기 코드입니다 –

+0

동일한 결과를 가지고 있지만 "깨끗합니다". 이것은 taglibs와 함께 Java Web App 월드에서 발생하는 비슷한 인수입니다 (<% %>). 표현과 관련된 것입니다 결국 당신과 당신의 팀이 "올바른 방법"으로 결정한 것에 달려 있습니다 – Sixty4Bit

0

앞에서 언급했듯이 헬퍼는 일반적으로 뷰 코드를 구동하지만 뷰 코드 자체가 아닌 비즈니스 로직으로 사용되는 것으로 생각됩니다. 뷰 코드 스 니펫을 생성하는 것들을 넣는 가장 일반적인 장소는 부분적인 것입니다. 부분적으로 필요한 경우 도우미를 호출 할 수 있지만 일들을 분리하여 유지하려면 비즈니스를 도우미에게 맡기고 부분적으로보기가 가장 좋습니다.

또한이 규칙은 엄격하고 빠른 규칙이 아니라 모든 규칙에 유의하십시오. 컨벤션을 깰 좋은 이유가 있다면 가장 잘하는 일을하십시오.

+1

헬퍼가 비즈니스 로직을위한 것이라고 생각하지 않습니다 뷰와 관련된 모든 종류의 헬퍼는 뷰 로직 비즈니스 로직보다는 핵심 비즈니스 로직을 모델 레이어에 저장해야한다고 생각한다. –

+0

사실 비즈니스 로직은 분명히 그렇지 않다는 것을 의미한다. 프레 젠 테이 션 레이어입니다. 하지만 컨트롤러가 아닌 모델에서 찾을 수 있습니다. 그게 내 모든 앱이 고장난 이유입니까? 권자 –

5

아무 문제가 없다고 생각하지 않습니다. 대다수의 레일 헬퍼가 HTML 코드를 생성합니다. (이 코드는 자신의 목적입니다) - 이것은 나 자신이하는 일이라는 것을 의미합니다.

그러나 코드 가독성 문제는 항상 존재합니다. 원시 HTML의 큰 문자열을 만드는 도우미가 있다면 이해하기 어려울 것입니다. 이 헬퍼에서 HTML을 생성하는 미세이지만, 당신은 당신의 도우미 메서드는 HTML 태그를 반환은 content_tag 같은 것들을 사용하여이 작업을 수행하고, render :partial 아니라 만드는 단지 레일 3에 return %Q(<a href="#{something}">#{text}>)

1

당신이 * html_safe * 문자열 방법을 사용할 수있는 것보다해야 탈출하지 않을 것이다.

-1

일반적으로 부분적인 부분에 html을 넣습니다.

의미에 대해 생각해보십시오. html을 문자열에 넣으면 의미 론적 측면이 사라집니다. 즉, 마크 업 대신 문자열이됩니다. 아주 다른. 예를 들어 문자열의 유효성을 검사 할 수는 없지만 마크 업의 유효성을 검사 할 수는 있습니다.

나는 html을 부분 대신 (그리고이 스레드를 어떻게 찾았는지) 헬퍼에 넣고 싶은 이유는 간결합니다. =render 'hr' 대신 =hr을 쓸 수 있기를 바랍니다.

내가 ;-) 묻지 않은 질문에 대답하기 : 취소 탈출 HTML에 도우미로를 시도이

def hr 
    raw '<hr />' 
end 
관련 문제