2010-10-05 23 views
17

tôi xác định chức năng trong ứng dụng helper:đường ray, Làm cách nào để xây dựng bảng trợ giúp bằng content_tag?

def display_standard_table(columns, collection = {})  
    content_tag :table do  
    concat content_tag :thead do 
     content_tag :tr do 
     concat columns.collect { |column| content_tag(:td, column[:display_name]) } 
     end 
    end  

    concat content_tag :tbody do 
     collection.collect { |elem| 
     concat content_tag(:tr, columns.collect { |column| 
      content_tag(:td, elem.attributes[column[:name]]) 
     }) 
    } 
    end 
    end 
end 

và tôi gọi nó là quan điểm của tôi:

<%= display_standard_table(
      [ 
      { :name => 'id', :display_name => 'Id' }, 
      { :name => 'login', :display_name => 'Login' }, 
      { :name => 'first_name', :display_name => 'Name' }, 
      { :name => 'last_name', :display_name => 'LastName' }, 
      { :name => 'email', :display_name => 'Email'} 
      ], @users) %> 

Sản lượng trong html là:

<table><thead></thead><tbody></tbody></table> 

và nó sẽ là:

<table><thead><tr><td>Id</td><td>Login</td>...</tr></thead><tbody><tr>row here</tr></tbody></table> 

và tôi không thể tìm ra những gì còn thiếu. (. Btw Tôi đang sử dụng rails3)

[EDIT]

def display_standard_table(columns, collection = {})  
    content_tag(:table) do 
    concat(content_tag(:thead) do 
     concat(content_tag(:tr) do 
     concat(columns.collect { |column| content_tag(:td, column[:display_name]) }) 
     end) 
    end) 

    concat(content_tag(:tbody) do 
     concat(collection.collect { |elem| 
     content_tag(:tr, columns.collect { |column| 
      content_tag(:td, elem.attributes[column[:name]]) 
     }) 
     }) 
    end) 
    end 
end 

Phiên bản trên hoạt động ok nhưng tạo ra html được thoát:/theo chuỗi tài liệu được tạo ra bởi content_tag nên html_safe, nhưng chúng đã thoát:/

Trả lời

0

Đó là số thiếuconcat trong số :tr liên quan content_tag của bạn.

Cập nhật

Đối với thoát, hãy nhìn vào các api docs for content_tag. Bạn cần phải xác định không để thoát khỏi nó. Tất nhiên, bạn sẽ chịu trách nhiệm thoát khỏi những thứ bên trong các thẻ mà bạn muốn thoát trong trường hợp đó.

+0

khi tôi loại bỏ concat ở tất cả nó mang lại cho tôi điều này:

5

Trên thực tế bạn chỉ thiếu một cộng giữa các thẻ nội dung, bạn có thể tìm thấy một câu hỏi tương tự ở đây

Rails- nested content_tag

Vấn đề với điều này, có thể bạn sẽ gặp lỗi cú pháp vì cách bạn đang sử dụng các khối, nếu bạn sử dụng câu lệnh "{}" thay vì "kết thúc", bạn sẽ là Ok.

Ở đây (Change to the way the block is handled), bạn có thể tìm một ví dụ và cách giải quyết trong trường hợp bạn sử dụng Rails 3 vì dường như Rails 3 bỏ qua kết quả của lệnh thu thập khi nằm trong thẻ nội dung.

+0

Nice và đơn giản, cảm ơn! –

27
def display_standard_table(columns, collection = {}) 

thead = content_tag :thead do 
    content_tag :tr do 
    columns.collect {|column| concat content_tag(:th,column[:display_name])}.join().html_safe 
    end 
end 

tbody = content_tag :tbody do 
    collection.collect { |elem| 
    content_tag :tr do 
     columns.collect { |column| 
      concat content_tag(:td, elem.attributes[column[:name]]) 
     }.to_s.html_safe 
    end 

    }.join().html_safe 
end 

content_tag :table, thead.concat(tbody) 

end 
0

Thêm '.join(). Html_safe' vào cuối mỗi phần thu thập. Đó là những gì làm việc cho tôi.

collection.collect { |elem| 
    concat content_tag(:tr, columns.collect { |column| 
     content_tag(:td, elem.attributes[column[:name]]) 
    }) 
}.join().html_safe 
Các vấn đề liên quan