2010-10-05 13 views
17

zdefiniowałem funkcję pomocnika Zastosowanie:szyny, Jak zbudować tabelę w helper za pomocą 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 

i ja to nazywam moim zdaniem:

<%= 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) %> 

Wyjście w html jest:

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

i powinno być:

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

i nie mogę określić, czego brakuje. (. Btw używam 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 

Powyższa wersja działa ok, ale jest generowany html uciekł:/zgodnie z ciągów dokumentacja sporządzona przez content_tag powinny być html_safe, ale są uciekł:/

Odpowiedz

0

To brakujeconcat w :tr związane content_tag.

Aktualizacja

chodzi o ucieczce, spójrz na api docs for content_tag. Musisz określić, aby nie uciec. Oczywiście, byłbyś odpowiedzialny za ucieczkę od rzeczy wewnątrz tagów, które chcesz uciec w tym przypadku.

+0

Kiedy usunąć concat w ogóle daje mi to:

5

Właściwie brakuje tylko plus pomiędzy znacznikami treści można znaleźć podobne pytanie tutaj

Rails- nested content_tag

Problem polega na tym, że być może dostaniesz błąd składniowy ze względu na sposób, w jaki używasz bloków, jeśli użyjesz instrukcji "{}" zamiast "do końca", to będzie OK.

Tutaj (Change to the way the block is handled) można znaleźć przykład i obejście problemu w przypadku korzystania z Rails 3, ponieważ pozornie Rails 3 zignorować wynik instrukcji collect, gdy jest wewnątrz tagu treści.

+0

ładne i proste, dzięki! –

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

Dodanie ".join(). Html_safe" na końcu każdej sekcji gromadzenia. To właśnie dla mnie zadziałało.

collection.collect { |elem| 
    concat content_tag(:tr, columns.collect { |column| 
     content_tag(:td, elem.attributes[column[:name]]) 
    }) 
}.join().html_safe 
Powiązane problemy