0

这是动态创建 XML 的 XML 函数:

def make_toc
  builder = Nokogiri::XML::Builder.new do |xml|
    xml.ncx( xmlns: "http://www.daisy.org/z3986/2005/ncx/", version: "2005-1", "xml:lang"=>"eng"  ) do
      xml.head do
        xml.meta( content: book.uuid, name: "dtb:uid")
        xml.meta( content: "2", name: "dtb:depth")
        xml.meta( content: "0", name: "dtb:totalPageCount")
        xml.meta( content: "0", name: "dtb:maxPageNumber")
      end
      xml.docTitle do
        xml.text_ book.full_title
      end
      xml.navMap do
        i=0
        self.oeb_parts.each do |section|
          next if section.name.blank?
          i = i + 1
          xml.navPoint( id: section.uuid, playOrder: i.to_s) do
            xml.navLabel do
              xml.text_ section.name
            end
            xml.content(src: File.basename(section.file.path))
      unless self.toc_json.nil?
  toc = eval(self.toc_json)
  prev_list = 0
  value=''
  toc.each do |toc_node|
    if toc_node['part_id'].to_i == section.id.to_i
      j=0
      toc_node.each do |key, toc_part|
        if key != "part_id" && key != "position" && key != "part_name"
    value = ''
    j=i+1
    i=j
    n = toc_part['list'] - prev_list
    if n > 0
      n.times {
        value = value+"xml.navPoint( id: toc_part['id'], playOrder: j.to_s) do"
      }
    end
    m = prev_list - toc_part['list']
    if m > 0
      m.times {
        value = value+"end"
      }
    end
    value = value+"xml.navLabel do
      xml.text_ toc_part['value']
    end
    xml.content(src: File.basename(section.file.path)+'#'+toc_part['id'])"
    prev_list = toc_part['list']
                      "#{value}"
        end
      end
    end
  end
  m = prev_list - (-1)
  if m > 0
    m.times {
      value=value+"end"
    }
        end
      end
          end
        end
      end
    end
  end
  builder.to_xml
end

如何执行这个?

if n > 0
  n.times {
    value = value+"xml.navPoint( id: toc_part['id'], playOrder: j.to_s) do"
  }
end

我想xml.navPoint( id: toc_part['id'], playOrder: j.to_s) do在循环中运行。如果我直接调用它而不进行任何插值,则会引发“意外结束”错误。

在视图文件中,我可以使用html_safe或 raw 将字符串转换为 HTML。但在模型中我不知道如何转换它。

谁能帮我解决这个问题?

4

1 回答 1

0

好的,我将尝试使其尽可能具有建设性,但请查看一些 ruby​​ 编程教程。该文件中有很多语法错误,并且您的实现对于您最终希望拥有的内容非常混乱。还有一些我没有定义的变量,这个问题可能无法按原样回答。(例如book

这条线是非常错误的。看起来您想在末尾调用一个块,do但这不会在您的字符串中进行评估。也不value = value +是红宝石的方式。试试<<。如果您需要多行块,也{..}可用于调用内联块,并使用do关键字调用它。

n.times {value = value+"xml.navPoint( id: toc_part['id'], playOrder: j.to_s) do"}

n.times do |i|
   #i will contain the current iteration number as it loops through n
   value << xml.navPoint( id: toc_part['id'], playOrder: j.to_s) do
      #some other block here
   end 
end

此行有一个未终止的字符串。似乎您又一次尝试在字符串中调用一个块value = value +

value = value+"xml.navLabel do
                  xml.text_ toc_part['value']
                end

不知道这条线是干什么用的?每个循环都不会返回该值,它将返回.each调用的原始对象。

"#{value}"

还有其他问题,但就像我说的,这里真正的问题似乎只是对 ruby​​ 及其语法的理解有限。请不要将此视为负面评论,因为它具有建设性,如果您更好地理解语言,您可以更好地理解您的问题。

于 2014-03-17T14:11:54.580 回答