【问题标题】:rails, How to build table in helper using content_tag?rails,如何使用 content_tag 在助手中构建表?
【发布时间】:2011-04-21 07:13:32
【问题描述】:

我在应用程序助手中定义了函数:

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

我认为是这样的:

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

html中的输出为:

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

它应该是:

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

我无法弄清楚缺少什么。 (顺便说一句。我正在使用 rails3)

[编辑]

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

上述版本工作正常,但生成的 html 被转义:/ 根据 content_tag 生成的文档字符串应该是 html_safe,但它们被转义了:/

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

      其实你只是在内容标签之间少了一个加号,你可以在这里找到一个类似的问题

      Rails- nested content_tag

      这样做的问题是,由于使用块的方式,您可能会遇到语法错误,如果您使用“{}”而不是“do end”语句,您会没事的。

      在这里 (Change to the way the block is handled),您可以在使用 Rails 3 的情况下找到示例和解决方法,因为显然 Rails 3 在内容标签内时会忽略 collect 语句的结果。

      【讨论】:

        【解决方案3】:

        请参阅有关此内容的 railscast:http://railscasts.com/episodes/208-erb-blocks-in-rails-3 全部是解释您如何在 rails 3 中管理块助手

        【讨论】:

          【解决方案4】:

          这是您的:tr 相关content_tag 中的concat缺失

          更新

          至于转义,看api docs for content_tag。您需要指定不要转义它。当然,在这种情况下,您将负责转义您想要转义的标签内的内容。

          【讨论】:

          • 当我完全删除 concat 时,它给了我这个:
          【解决方案5】:

          在每个收集部分的末尾添加“.join().html_safe”。这对我有用。

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

          【讨论】:

            猜你喜欢
            • 2011-07-16
            • 1970-01-01
            • 2015-02-19
            • 2014-03-26
            • 2012-11-26
            • 2011-05-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多