ruby-on-rails - 在 Rails 3.1 中,如何创建使用 block 样式格式的 HTML 表格生成器

标签 ruby-on-rails ruby-on-rails-3 html-table

我正在开发一个在许多不同区域显示表格数据的应用程序,我发现自己经常一遍又一遍地使用相同的 HTML 表格结构。例如,特定的表格如下所示:

%table.zebra-striped#user-table{ :cellspacing => "0" }
  %colgroup
    %col{:id => "email"}
    %col{:id => "username"}
    %col{:id => "sign-in-count"}
    %col{:id => "last-sign-in-at"}

  %thead
    %tr
      %th{:id => "email-head", :scope => "col"} E-mail
      %th{:id => "username-head", :scope => "col"} Username
      %th{:id => "sign-in-count-head", :scope => "col"} Sign Ins
      %th{:id => "last-sign-in-at-head", :scope => "col"} Last Sign In

  %tbody
    - @users.each do |user|
      %tr{ :class => zebra }
        %td
          =h user.email
        %td
          =h user.username
        %td
          =h user.sign_in_count
        %td
          =h user.last_sign_in_at

理想情况下,我想创建某种辅助方法,我可以在其中执行类似以下操作:

= custom_table_for @users do
  = column :email
  = column :username do |user|
    = link_to user.username, user_path(user)
  = column "Sign Ins", :sign_in_count
  = column :last_sign_in_at

如果我对默认值不满意,我可以通过这种方式更改列中数据的格式和列标题名称,但会为我生成表格。

我想我可以创建一个普通的助手,但我必须使用数组,而且我不知道如何在每列中包含自定义数据格式。

active_admin 有类似的东西,你可以在这里看到:http://activeadmin.info/docs/3-index-pages/index-as-table.html

任何线索或想法将不胜感激。

最佳答案

我刚想到这个:

几点:

  • 线路@columns = []是重置,因此您可以多次调用它。
  • yield在 custom_table_for 中调用您传递给它的 block 。
  • block在列方法中存储和调用 custom_table_for如果已设置。

我也包含了一个示例类来展示用法。

请注意,我是在 Rails 应用程序之外执行此操作的,您几乎肯定想使用 http://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-content_tag而不是 p "<table>"当您在控制台中运行它时,这仅用于示例目的。

module TableHelper
  def custom_table_for(items)
    @columns = []
    yield
    p "<table>"
      @columns.each do |c|
        p "<th>#{c[:value]}</th>"
      end

      items.each do |e|
        p "<tr>"
        @columns.each do |c|
          e[c[:name]] = c[:block].call(e[c[:name]]) if c[:block]
          p "<td>#{e[c[:name]]}</td>"
        end
        p "</tr>"
      end
    p "</table>"
  end

  def column(name, value = nil, &block)
    value = name unless value
    @columns << {:name => name, :value => value, :block => block}
  end
end

class ExampleTable
  include TableHelper
  def test
    @users = [{:email => "Email 1", :username => "Test User"}, {:email => "Email 2", :username => "Test User 2"}]  
    custom_table_for @users do
      column :email, "Email"
      column :username do |user|
        user.upcase
      end
    end
  end
end

et = ExampleTable.new
et.test

更新

我将其迁移到 rails 以使用 content_tags

module TableHelper
  def custom_table_for(items)
    @columns = []
    yield


    content_tag :table do
      thead + tbody(items)
    end

  end

  def thead
    content_tag :thead do
      content_tag :tr do 
        @columns.each do |c|
          concat(content_tag(:th, c[:value]))
        end
      end
    end
  end

  def tbody(items)
    content_tag :tbody do
      items.each { |e|
       concat(content_tag(:tr){
          @columns.each { |c|
            e[c[:name]] = c[:block].call(e[c[:name]]) if c[:block]
            concat(content_tag(:td, e[c[:name]]))
          }
        })
      }
    end
  end

  def column(name, value = nil, &block)
    value = name unless value
    @columns << {:name => name, :value => value, :block => block}
  end
end

关于ruby-on-rails - 在 Rails 3.1 中,如何创建使用 block 样式格式的 HTML 表格生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560965/

相关文章:

javascript - Ruby on Rails - 使用 kaminari 和搜索表单加载更多按钮。 jQuery问题

ruby-on-rails - OS X El Capitan - 无法使用 gem 安装 bundler

ruby-on-rails - 评论对应用程序性能的影响有多大?

javascript - 跨域 jquery ajax 未获取 json

css - 控制表格列宽

html - 如何正确旋转表格单元格内的文本

ruby-on-rails - 如何在 Active Record POSTGRES 中使用 BETWEEN 搜索字符串数组,

sql - 在 Ruby、Activerecord 或 Postgresql 中按周对事件进行分组和计数

html - TD 宽度不改变 CSS HTML

ruby-on-rails - 如何使我的 Ruby regEx 编译为与它所应用的变量相同的编码?