gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:34:35 25 4
gpt4 key购买 nike

我正在开发一个在许多不同区域显示表格数据的应用程序,我发现自己经常一遍又一遍地使用相同的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com