Rails- content_tag lồng nhau


84

Tôi đang cố gắng lồng các thẻ nội dung vào một trình trợ giúp tùy chỉnh, để tạo ra một cái gì đó như sau:

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

Lưu ý rằng đầu vào không được liên kết với biểu mẫu, nó sẽ được lưu qua javascript.

Đây là trình trợ giúp (nó sẽ làm được nhiều việc hơn sau đó chỉ hiển thị 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' %>

Tuy nhiên, nhãn không được hiển thị khi tôi gọi người trợ giúp, chỉ hiển thị thông tin đầu vào. Nếu nó nhận xét ra text_field_tag, thì nhãn sẽ được hiển thị.

Cảm ơn!

Câu trả lời:


155

Bạn cần một +cách khắc phục nhanh chóng: 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' %>

Bên trong khối content_tag :div, chỉ chuỗi trả về cuối cùng mới được hiển thị.


1
Typo (trong bình mà thôi, nhưng hơi khó hiểu) - "Không e dấu + ở dòng này"
Chowlett

Sau khi thêm rằng trong, tôi nhận được lỗi cú pháp: lỗi cú pháp, tIDENTIFIER bất ngờ, mong KDO hoặc '{' hoặc '(' tên text_field_tag, '',: class => 'vừa new_value' ^
christo16

2
Điều này cảm thấy bẩn ... đó là bởi vì nó là một mô hình chống đối với người trợ giúp để xây dựng nhiều thẻ nội dung?
Erik Trautman

Không làm việc cho tôi, đã phải sử dụng concatgiống như câu trả lời khác đề nghị
Dex

55

Bạn cũng có thể sử dụng phương thức 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

Nguồn: Nesting content_tag trong Rails 3


Điều này làm việc với tôi miễn là dòng concat nằm trên 1 dòng. Tôi đã không dành chơi lâu với nó, tuy nhiên, do đó có thể là một cách để làm điều đó nhiều dòng
TerryS

đây sẽ là một cách tốt hơn khi xem xét vấn đề html_safe. sử dụng +giữa chuỗi không htmlsafe sẽ làm cho mọi thứ không htmlsafe
Tian Chen

Nếu bạn đang ở trong một lớp mẫu xây dựng, nó phải là@template.concat
elquimista

Tôi nghĩ đó là một cách giải quyết sạch sẽ hơn +. Dễ đọc hơn và Rubocop không như+
escanxr

2

Tôi sử dụng một biến và concat để giúp lồng sâu hơn.

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

việc xây dựng các thẻ nội dung lồng nhau với sự lặp lại hơi khác một chút và luôn giúp tôi ... đây là một phương pháp:

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.