Rails- 중첩 된 content_tag


84

콘텐츠 태그를 사용자 지정 도우미에 중첩하여 다음과 같이 만들려고합니다.

<div class="field">
   <label>A Label</label>
   <input class="medium new_value" size="20" type="text" name="value_name" />
</div>

입력은 양식과 연관되지 않으며 javascript를 통해 저장됩니다.

다음은 도우미입니다 (HTML을 표시 한 다음 더 많은 작업을 수행함).

module InputHelper
    def editable_input(label,name)
         content_tag :div, :class => "field" do
          content_tag :label,label
          text_field_tag name,'', :class => 'medium new_value'
         end
    end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

그러나 헬퍼를 호출하면 레이블이 표시되지 않고 입력 만 표시됩니다. text_field_tag를 주석 처리하면 레이블이 표시됩니다.

감사!

답변:


155

+빠른 수정 이 필요합니다 : D

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      content_tag(:label,label) + # Note the + in this line
      text_field_tag(name,'', :class => 'medium new_value')
    end
  end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

의 블록 안에는 content_tag :div마지막으로 반환 된 문자열 만 표시됩니다.


1
오타 (주석에만 있지만 약간 혼란
스러움

추가 한 후 구문 오류 : 구문 오류, 예기치 않은 tIDENTIFIER, kDO 또는 '{'또는 '('text_field_tag ​​name, '', : class => 'medium new_value'^
christo16

2
이건 더럽게 느껴져요 ... 도우미가 여러 콘텐츠 태그를 빌드하는 안티 패턴이기 때문인가요?
Erik Trautman 2014-09-26

나를 위해 일하지 않았고 concat, 다른 답변이 제안 하는 것처럼 사용해야했습니다
Dex

55

concat 메서드를 사용할 수도 있습니다 .

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      concat(content_tag(:label,label))
      concat(text_field_tag(name,'', :class => 'medium new_value'))
    end
  end
end

출처 : Rails 3의 중첩 content_tag


이것은 concat 라인이 한 줄에있는 한 나를 위해 일했습니다. 그래서 그것을 다중 회선 할 수있는 방법 거기에 아마,하지만, 그것은 긴 재생을 지출하지 않았다
TerryS

이것은 html_safe 문제를 고려할 때 더 나은 방법이 될 것입니다. 사용 +비 htmlsafe 문자열 사이에하는 모든 비 - htmlsafe를 만들 것입니다
티안 첸

폼 빌더 클래스 안에있는 경우이어야한다@template.concat
elquimista

나는 그것이 +. 더 읽기 쉽고 Rubocop은 싫어합니다+
escanxr

2

더 깊은 중첩을 돕기 위해 변수와 연결을 사용합니다.

def billing_address customer
  state_line = content_tag :div do
    concat(
      content_tag(:span, customer.BillAddress_City) + ' ' +
      content_tag(:span, customer.BillAddress_State) + ' ' +
      content_tag(:span, customer.BillAddress_PostalCode)
    )
  end
  content_tag :div do
    concat(
      content_tag(:div, customer.BillAddress_Addr1) +
      content_tag(:div, customer.BillAddress_Addr2) +
      content_tag(:div, customer.BillAddress_Addr3) +
      content_tag(:div, customer.BillAddress_Addr4) +
      content_tag(:div, state_line) +
      content_tag(:div, customer.BillAddress_Country) +
      content_tag(:div, customer.BillAddress_Note)
    )
  end
end

1

반복을 사용하여 중첩 된 콘텐츠 태그를 작성하는 것은 약간 다르며 매번 저를 얻습니다. 여기 한 가지 방법이 있습니다.

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.