没有将 StringIO 隐式转换为 String (TypeError) - ruby
no implicit conversion of StringIO into String (TypeError) - ruby
我有一个名为 import.rb
的脚本,它将 json 内容从 url 导入到 jekyll 的草稿目录中。下面是我的代码。
require 'fileutils'
require 'json'
require 'open-uri'
# Load JSON data from source
# (Assuming the data source is a json file on your file system)
data = JSON.parse(open('https://script.google.com/macros/s/AKfycbyHFt1Yz96q91-D6eP4uWtRCcF_lzG2WM-sjrpZIr3s02HrICBQ/exec'))
# Proceed to create post files if the value array is not empty
array = data["user"]
if array && !array.empty?
# create the `_drafts` directory if it doesn't exist already
drafts_dir = File.expand_path('./_drafts', __dir__)
FileUtils.mkdir_p(drafts_dir) unless Dir.exist?(drafts_dir)
# iterate through the array and generate draft-files for each entry
# where entry.first will be the "content" and entry.last the "title"
array.each do |entry|
File.open(File.join(drafts_dir, entry.last), 'wb') do |draft|
draft.puts("---\n---\n\n#{entry.first}")
end
end
end
当我 运行 ruby _scripts/import.rb
我得到类似
的错误
3: from _scripts/import.rb:7:in `<main>'
2: from /usr/lib/ruby/2.5.0/json/common.rb:156:in `parse'
1: from /usr/lib/ruby/2.5.0/json/common.rb:156:in `new'
/usr/lib/ruby/2.5.0/json/common.rb:156:in `initialize': no implicit conversion of StringIO into String (TypeError)
请提出更正建议。
改变这个:
data = JSON.parse(open('https://script.google.com/macros/s/AKfycbyHFt1Yz96q91-D6eP4uWtRCcF_lzG2WM-sjrpZIr3s02HrICBQ/exec'))
为此:
data = JSON.parse(open('https://script.google.com/macros/s/AKfycbyHFt1Yz96q91-D6eP4uWtRCcF_lzG2WM-sjrpZIr3s02HrICBQ/exec').string)
.string
方法Returns underlying String object
。
当你在做的时候,改变这个:
array && !array.empty?
为此:
array&.any?
&.
是 ,它简化了检查 nil
和调用对象方法的过程。从风格的角度来看,更喜欢调用 array.any?
而不是 !array.empty?
.
最后,当使用 FileUtils.mkdir_p
时,您不必包含保护条件 unless Dir.exist?(drafts_dir)
。可以安全地调用它而不必担心它会删除或覆盖现有目录。
我有一个名为 import.rb
的脚本,它将 json 内容从 url 导入到 jekyll 的草稿目录中。下面是我的代码。
require 'fileutils'
require 'json'
require 'open-uri'
# Load JSON data from source
# (Assuming the data source is a json file on your file system)
data = JSON.parse(open('https://script.google.com/macros/s/AKfycbyHFt1Yz96q91-D6eP4uWtRCcF_lzG2WM-sjrpZIr3s02HrICBQ/exec'))
# Proceed to create post files if the value array is not empty
array = data["user"]
if array && !array.empty?
# create the `_drafts` directory if it doesn't exist already
drafts_dir = File.expand_path('./_drafts', __dir__)
FileUtils.mkdir_p(drafts_dir) unless Dir.exist?(drafts_dir)
# iterate through the array and generate draft-files for each entry
# where entry.first will be the "content" and entry.last the "title"
array.each do |entry|
File.open(File.join(drafts_dir, entry.last), 'wb') do |draft|
draft.puts("---\n---\n\n#{entry.first}")
end
end
end
当我 运行 ruby _scripts/import.rb
我得到类似
3: from _scripts/import.rb:7:in `<main>'
2: from /usr/lib/ruby/2.5.0/json/common.rb:156:in `parse'
1: from /usr/lib/ruby/2.5.0/json/common.rb:156:in `new'
/usr/lib/ruby/2.5.0/json/common.rb:156:in `initialize': no implicit conversion of StringIO into String (TypeError)
请提出更正建议。
改变这个:
data = JSON.parse(open('https://script.google.com/macros/s/AKfycbyHFt1Yz96q91-D6eP4uWtRCcF_lzG2WM-sjrpZIr3s02HrICBQ/exec'))
为此:
data = JSON.parse(open('https://script.google.com/macros/s/AKfycbyHFt1Yz96q91-D6eP4uWtRCcF_lzG2WM-sjrpZIr3s02HrICBQ/exec').string)
.string
方法Returns underlying String object
。
当你在做的时候,改变这个:
array && !array.empty?
为此:
array&.any?
&.
是 nil
和调用对象方法的过程。从风格的角度来看,更喜欢调用 array.any?
而不是 !array.empty?
.
最后,当使用 FileUtils.mkdir_p
时,您不必包含保护条件 unless Dir.exist?(drafts_dir)
。可以安全地调用它而不必担心它会删除或覆盖现有目录。