多级块方法正在产生问题

2023-12-01

我有课

class DataListBuilder
    include ActionView::Helpers::TagHelper
    include ActionView::Helpers::CaptureHelper
    include ActionView::Helpers::UrlHelper
    attr_accessor :object, :output_buffer

    def initialize(object)
      @object, @output_buffer = object, nil
    end

    def column (&block)
      if block_given?
        content_tag(:li, block.call(self))
      else
        content_tag(:li, "")
      end
    end

    def options_column(&link_block)
      if block_given?
        content_tag(:li, content_tag(:dl, "<dt><a href='#'>&nbsp;</a></dt><dd><ul>#{link_block.call(self)}</ul></dd>".html_safe, :class=>'options'))
      else
        content_tag(:li, "")
      end
    end

    def link_item(title, url, options={})
      content_tag :li, link_to(title, url, options)
    end
  end

并将其称为

<%= l.options_column do |c| %>
        <%= c.link_item 'Show', lead_path(c.object) %>
        <%= c.link_item 'Edit', edit_lead_path(c.object) %>
        <%= c.link_item 'New Note', "leads/#{c.object.id}/notes/new", :class=>"display-newxdoc", :id=>c.object.id %>
        <%= c.link_item 'Create Opportunity', new_lead_opportunity_path(c.object) %>
    <% end %>

所需的输出是

<li><dl class="options"><dt><a href="#">&nbsp;</a></dt><dd><ul style="display: none;">
    <li><a data-remote="true" class="plus" href="leads/details/309">&nbsp;</a></li>
    <li>3w</li>
    <li>Simon Wu</li>
    <li>1-714-553-0888</li>
    <li>[email protected]</li>
    <li>Unified Beat</li>

        <li><a href="/leads/309">Show</a></li>
        <li><a href="/leads/309/edit">Edit</a></li>
        <li><a id="309" class="display-newxdoc" href="leads/309/notes/new">New Note</a></li>
        <li><a href="/leads/309/opportunities/new">Create Opportunity</a></li>

但它正在产生

<li><a href="/leads/309">Show</a></li>
<li><a href="/leads/309/edit">Edit</a></li>
<li><a id="309" class="display-newxdoc" href="leads/309/notes/new">New Note</a></li>
<li><a href="/leads/309/opportunities/new">Create Opportunity</a></li>
<li><dl class="options"><dt><a href="#">&nbsp;</a></dt><dd><ul style="display: none;">
    <li><a data-remote="true" class="plus" href="leads/details/309">&nbsp;</a></li>
    <li>3w</li>
    <li>Simon Wu</li>
    <li>1-714-553-0888</li>
    <li>[email protected]</li>
    <li>Unified Beat</li>

        <li><a href="/leads/309">Show</a></li>
        <li><a href="/leads/309/edit">Edit</a></li>
        <li><a id="309" class="display-newxdoc" href="leads/309/notes/new">New Note</a></li>
        <li><a href="/leads/309/opportunities/new">Create Opportunity</a></li>
</ul></dd></dl></li>
    </ul></dd></dl></li>

任何人都可以帮助我吗?

完整代码已列出here.


首先,我们重构了您的助手,以便更频繁地使用content_tag(只是为了了解这段代码中发生了什么^_^)。

接下来我们添加使用output_buffer它在 helper 中被定义但根本没有使用。

在它之后应该调用的所有方法erb应该返回nil所以它们没有出现在 HTML 中。

最后一个语法糖是使用instance_eval所以你不需要{|c| ...}样式块。您可以使用以下所有变量DataListBuilder直接在那里。

module DataListHelper
  def list_headers(args=[])
    args    = Array.new(args)
    columns = []
    args.map { |o| columns << content_tag(:li, o.split(":").first, :style=>"width:#{o.split(":").second}px;") }
    content_tag(:ul, columns.join(" ").html_safe, :class=>"list-headers")
  end

  def data_list_total_records(array)
    content_tag(:div, page_entries_info(array).html_safe, :class=>"total-records")
  end

  def data_list_for(object, headers=[], &block)

    if object.is_a? Array
      if object.length == 0
        list_headers(headers).concat(content_tag(:strong, "<br />No records found".html_safe))
      else
        res_obj = data_list_total_records(object)
        res_obj << content_tag(:ol, :class=>"data-list") do
          res_ol = content_tag(:li) do
            res = list_headers(headers)
            object.each do |o|
              builder = DataListBuilder.new(o)
              res << content_tag(:li) do
                content_tag(:ul, :id=>o.id, :class=>"list-row #{cycle('odd', 'even')}") do
                  capture(builder, &block)
                  builder.output_buffer.html_safe
                end
              end
            end
            res
          end
          res_ol << data_list_pagination(object)
        end
        res_obj
      end
    else
      list_headers(headers).concat(content_tag(:strong, " <br />Not available."))
    end
  end

  class DataListBuilder
    include ActionView::Helpers::TagHelper
    include ActionView::Helpers::CaptureHelper
    include ActionView::Helpers::UrlHelper
    include Rails.application.routes.url_helpers

    attr_accessor :object, :output_buffer, :controller

    def initialize(object)
      @object, @output_buffer = object, ''
    end

    def column (&block)
      @output_buffer << if block_given?
        content_tag(:li, instance_eval(&block))
      else
        content_tag(:li, "")
      end
      nil
    end

    def options_column(&link_block)
      @output_buffer << if block_given?
        content_tag(:li) do
          content_tag(:dl, :class=>'options') do
            res = content_tag(:dt) do
              content_tag(:a, '&nbsp;'.html_safe, :href => '#')
            end
            res << content_tag(:dd) do
              content_tag(:ul) do
                instance_eval &link_block
              end
            end
          end
        end
      else
        content_tag(:li, "")
      end
      nil
    end

    def link_item(title, url, options={})
      content_tag :li, link_to(title, url, options)
    end
  end
end

你的观点变成了这样:

<%= data_list_for @leads, [" :10", "Age:30", "Contact:140", "Phone:140", "Email:180", "Company:100", ""] do |l| %>
    <%= l.column { link_to "&nbsp;".html_safe, "leads/details/#{object.id}", :class=>:plus, :remote=>true } %>
    <%= l.column { object.age } %>
    <%= l.column { object.contact.complete_name } %>
    <%= l.column { object.contact.phones.blank? ? "-" : object.contact.phones.first.phone_number } %>
    <%= l.column { object.contact.emails.blank? ? "-" : object.contact.emails.first.email } %>
    <%= l.column { object.company.title } %>
    <%= l.options_column do %>
        <%= link_item 'Show', lead_path(object.id) %>
        <%= link_item 'Edit', edit_lead_path(object.id) %>
        <%= link_item 'New Note', "leads/#{object.id}/notes/new", :class=>"display-newxdoc", :id=>object.id %>
        <%= link_item 'Create Opportunity', new_lead_opportunity_path(object.id) %>
    <% end %>
<% end %>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多级块方法正在产生问题 的相关文章

随机推荐

  • 为什么 sbt 在设置 $JAVA_HOME 时报告“未检测到 java 安装”?

    我有 2 个 sbt android scala 项目 第一个是单个的 ls al drwxr xr x 13 alex staff 442 Dec 24 20 44 drwxr xr x 4 alex staff 136 Dec 24 2
  • JMS 消耗多个主题

    我是 Java 新手 正在开发一个使用多个 不同 主题并将其发送到另一台服务器的项目 我想知道处理多个主题的最佳方法是什么 据我了解 每个消费者都与一个主题相关 因此 如果我必须使用多个主题 则每个不同的主题都需要一个消费者 由于消费者进行
  • 如何修复一些 Xcode 13 错误,例如无法正确跳转到定义?

    我最近更新到 Xcode 13 突然 显示代码操作 中的选项不再起作用 这包括 跳转到定义 显示快速帮助 甚至突出显示所有使用某些规范的地方 有人遇到同样的问题或有解决办法吗 我已经尝试关闭应用程序 重新启动计算机 清理构建文件夹 但没有任
  • 在 Javascript 中将所有复选框值作为数组传递

    我有以下复选框 我需要将它们作为数组值获取
  • 防止弹性项目超过父级高度并使滚动条工作

    如何防止子div带有滚动条和flex 1超过 Firefox 中其父级 Flexbox 的高度 它在 Chrome 中工作正常 CodePen 链接 如果您更喜欢它而不是 Stack Overflow 片段 https codepen io
  • 在循环中追加到字典值列表

    我有一些代码 其中使用名称列表和结果文件 最终是多个文件 团队 名称 地点 我正在寻找的最终结果是将每个人的姓名 键 与点 值 列表相关联 但是 当我使用下面的代码时 我最终得到的结果如下 Abe 100 80 90 Bob 100 80
  • $_ 的奇怪值/行为

    输出应该是aaabbbcccdddeee not aaa555234dddeee perl wle map for my i 2 i lt 5 i push a a e print a aaa555234dddeee 仅在引用 取消引用时的
  • 如何异步等待 x 秒然后执行某些操作?

    我知道有Thread Sleep and System Windows Forms Timer and Monitor Wait在 C 和 Windows 窗体中 我似乎无法弄清楚如何等待 X 秒然后做其他事情 而不锁定线程 我有一个带有按
  • 如何在 python 中上传 FTP 上的完整目录? [复制]

    这个问题在这里已经有答案了 我必须在 FTP 服务器上上传一个目录 其中包含子目录和文件 但我似乎无法正确理解 我想按原样上传目录 及其子目录和文件所在的位置 ftp FTP ftp connect host port ftp login
  • hibernate中如何删除连接表中的记录

    论坛会员 我需要你们所有人的帮助 我有两个具有一对多关系的 POJO 模型 我的项目 pojo 如下 Entity Table name project public class Project implements java io Ser
  • 将文件存储在 HDFS 上的命令

    介绍 一个 Hadoop NameNode 和三个 DataNode 已安装并正在运行 下一步是向 HDFS 提供文件 已执行以下命令 hadoop fs copyFromLocal ubuntu 14 04 desktop amd64 i
  • 如何检测访问我的网站所使用的浏览器?

    如何检测用户正在使用什么浏览器 IE Firefox Opera 访问我的网站 Javascript PHP ASP Python JSP 以及您能想到的任何其他语言的示例都会有所帮助 是否有一种与语言无关的方法来获取此信息 如果是为了处理
  • Vim 的替代命令可以像 sed 的“t labe”一样处理递归模式吗?

    只是一个随机的例子 aaa 01 02 03 04 05 aaa 后面的数字个数不固定 替换后的预期结果是 aaa 01 aaa 02 aaa 03 aaa 04 aaa 05 我知道如何使用 sed 的 t label 或 Vim 使用类
  • 无法在 ubuntu 14.04 的终端内退出 emacs

    我在 ubuntu 14 04 上的终端中运行 emacs emacs nw 如果我尝试退出C x C c 我在底部的和弦空间中看到了这一点 C x 我是一个 Emacs 新手 但这看起来像是试图与c键 即使我将手指举过Ctrl钥匙 如果我
  • Visual Studio 2010 math.h 中不存在 rint 以及 CUDA rint 的等效项

    我正在将 CUDA 代码移植到 C 并使用 Visual Studio 2010 CUDA 代码使用rint函数 该函数似乎不存在于Visual Studio 2010 math h中 所以看来我需要自己实现它 根据这个link CUDAr
  • 底部弹出UIPicker?

    调用action时从屏幕底部弹出的UIPicker是否只是一个以某种方式协调的基本UIPickerView 就像 UIActionSheet 一样 我将如何实现它 这是我使用的动画代码 void animateDatePicker BOOL
  • 如何用日期范围填充表格?

    我需要一个 MySQL 表来保存 2011 01 01 和 2011 12 31 之间的所有日期 我创建了一个表 其中一个列名为 date 类型为 DATE 通过什么查询 我可以在表中填充所有所需的日期 而不必手动输入它们 尝试这个 DRO
  • 有没有办法用 C# 为 iphone 制作应用程序

    我想知道你们是否可以为 iPhone 制作 C NET 应用程序 我该如何开始 单点触控将是要走的路 附注我真的建议你在任何平台上使用原生版本
  • git/jenkins TLS 问题

    当 Jenkins 尝试克隆存储库时 我收到以下错误 无法连接到存储库 命令 usr bin git ls remote h https github com chkp lebowits protego examples HEAD 返回状态
  • 多级块方法正在产生问题

    我有课 class DataListBuilder include ActionView Helpers TagHelper include ActionView Helpers CaptureHelper include ActionVi