我正在尝试创建一个网页,以便能够在线销售商品,并在创建文件以自动创建新商品时遇到问题。我正在尝试使用Ruby暂时取消文件的末尾,将正确的行追加到文件中,然后将结尾放回去。到目前为止,我的代码是
puts "what is the item number?"
item_num = gets.chomp
puts "what is item description?(not optional)"
desc = gets.chomp
file_text = File.read("template.html")
file_text = file_text.gsub(/Item#/, "Item #{item_num.to_s}")
file_text = file_text.gsub(/<img class="item-image" src="">/, '<img class="item-image" src="' + item_num.to_s + '">')
file_text = file_text.gsub(/Item-desc/, desc)
puts file_text
file_create = File.new(item_num.to_s + ".html", "w")
file_create.puts(file_text)
file_create.close
item_page_end = '
</div>
<div class="col-sm-12">
<div class="headings">
</div>
</div>
</div>
</div>
</div>
<div class="footer" style="width=80%"/>
<script src="../js/jquery-3.1.1.js"></script>
<script src="../js/bootstrap.min.js"></script>
<script src="../js/owl.carousel.min.js"></script>
<script src="https://use.fontawesome.com/55b73bf748.js"></script>
<script src="../js/jquery.magnific-popup.js"></script>
<script src="../js/script.js"></script>
</body>
</html>
'
file_to_update = File.read("item_page.html")
file_to_update = file_to_update.gsub(item_page_end, "")
file_to_update = File.open("item_page.html", "a+")
file_to_update.puts( '<p class="col-md-4"><img src="../images/' + item_num + '.jpg" />Item' + item_num + '</p>')
file_to_update.puts(item_page_end)
sleep 10
HTML文件是:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SHS Metal | Store</title>
<link rel="shortcut icon" type="image/x-icon" href="../images/logo-icon.png"/>
<link href="../css/bootstrap.min.css" rel="stylesheet">
<link href="../css/bootstrap-theme.min.css" rel="stylesheet">
<link href="../css/owl.carousel.css" rel="stylesheet">
<link href="../css/owl.theme.default.min.css" rel="stylesheet">
<link href="../css/magnific-popup.css" rel="stylesheet">
<link href="../css/style.css" rel="stylesheet">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="main element">
<div class="container">
<div class="row">
<div class="col-sm-12">
<h2 class="title mt80">Store</h2>
</div>
<div class="col-sm-12">
<div class="headings">
</div>
</div>
</div>
</div>
</div>
<div class="footer" style="width=80%"/>
<script src="../js/jquery-3.1.1.js"></script>
<script src="../js/bootstrap.min.js"></script>
<script src="../js/owl.carousel.min.js"></script>
<script src="https://use.fontawesome.com/55b73bf748.js"></script>
<script src="../js/jquery.magnific-popup.js"></script>
<script src="../js/script.js"></script>
</body>
</html>
最终发生的事情是程序将我要添加到“item_page.html”文件的HTML行插入到最后,然后在末尾添加“item_page_end”字符串。有谁知道如何修复它将HTML行放在Ruby程序之后
<h2 class="title mt80">Store</h2>
我找到的任何其他解决方案都是数组,字符串或根本不起作用。
答案 0 :(得分:1)
如果您可以编辑HTML文件,我会看到两个可能的答案:
(请注意,在所有情况下,我都使用一个名为add_all_elements
的函数,这个函数只返回您想要放在文件中的任何内容。)
将文件剪成两半,读取上半部分,添加元素然后读取下半部分。它应该是这样的:
buffer = File.read("template_first_half.html")
buffer += add_all_elements()
buffer += File.read("template_second_half.html")
它易于使用,但HTML可能难以阅读。
您还可以在文件中添加引用并使用gsub替换它:
buffer = File.read("template.html")
buffer = buffer.gsub("#####anchor#####", add_all_elements())
也更容易使用,它需要在文件中放置一个唯一的子字符串。问题是引用在文件中必须绝对唯一。优点是HTML文件仍然易于阅读。
如果您无法编辑HTML文件:
line_num = 0
buffer = ''
break_point = 42
text.each_line do |line|
if line_num == break_point
buffer += add_all_elements()
end
buffer += line
line_num += 1
end
基本上,您逐行读取文件并将其放入缓冲区。当行数达到所需的值(这里是我在42处设置的变量break_point
)时,将所有元素插入缓冲区。
不方便的是,如果编辑文件,则每次都必须重新设置断点。您还可以使用字符串作为断点来避免大部分问题。
答案 1 :(得分:0)
你可以这样做:
file_to_update = File.read("item_page.html")
file_to_update = file_to_update.sub(/(?<=<h2 class="title mt80">Store<\/h2>)/,file_text)
File.write("item_page.html",file_to_update)
有了这个,就不需要为file_text创建一个新文件了。 基本上发生的是第二行,这里使用lookbehind断言在&#34; Store&lt; / h2&gt;&#34;之后将file_text插入file_to_update。然后,您只需使用更新后的字符串覆盖item_page.html的内容。