Ruby - 语法错误,意外的 tIDENTIFIER,期待结束

Ruby - syntax error, unexpected tIDENTIFIER, expecting end

请帮帮我,我做错了什么?我在我的 Fastfile 中通过 ruby 做电报通知程序并遇到了这个问题:

[!] Syntax error in your Fastfile on line 175: Fastfile:175: syntax error, unexpected tIDENTIFIER, expecting end
210...ication/json' --data '{"chat_id": "123456789", "media": [{"t...
211...                        ^~~~~~~
212Fastfile:175: syntax error, unexpected tINTEGER, expecting end
213... --data '{"chat_id": "123456789", "media": [{"type": "photo"...
214...                      ^~~~~~~~~

我的代码:

lane :detox do
    images = Dir.glob("folder/*.png")
      images.each do |image|
        puts image
      sh "curl --request POST --header 'Content-Type: application/json' --data '{"chat_id": "123456789", "media": [{"type": "photo", "media": "attach://image"}]'   https://api.telegram.org/botToken/sendMediaGroup"
    end

我发现这里有些地方不对。首先,您应该转义 sh 之后字符串中的所有引号。否则,字符串会提前终止,您将遇到错误。

其次,您打开了 2 个 do 块:lane :detox doimages.each do |image|,但您只有一个 end.

这应该是

lane :detox do
    images = Dir.glob("folder/*.png")
    images.each do |image|
      puts image
      sh "curl --request POST --header 'Content-Type: application/json' --data '{\"chat_id\": \"123456789\", \"media\": [{\"type\": \"photo\", \"media\": \"attach://image\"}]}'   https://api.telegram.org/botToken/sendMediaGroup"
    end
end

语法错误是由于在双引号字符串中使用未转义的双引号引起的:

str = "foo "bar" baz"
#          ^^^^^ won't work

您可以将 " 转义为 \",但使用 heredoc 通常更容易,因为它不需要转义:

sh <<-CMD
  curl https://api.telegram.org/botToken/sendMediaGroup \
    --request POST \
    --header 'Content-Type: application/json' \
    --data '{"chat_id": "123456789", "media": [{"type": "photo", "media": "attach://image"}]}'
CMD

但是,您也可以将命令选项作为单独的参数传递给 sh:

,而不是自己构建命令
sh(
  'curl', 'https://api.telegram.org/botToken/sendMediaGroup',
  '--request', 'POST',
  '--header', 'Content-Type: application/json',
  '--data', '{"chat_id": "123456789", "media": [{"type": "photo", "media": "attach://image"}]}'
)

这还允许您从 Ruby 散列动态创建 JSON:

require 'json'

data = {
  chat_id: "123456789",
  media: [{ type: "photo", media: "attach://image" }]
}

sh(
  'curl', 'https://api.telegram.org/botToken/sendMediaGroup',
  '--request', 'POST',
  '--header', 'Content-Type: application/json',
  '--data', data.to_json
)

这样做可以确保您的 JSON 始终有效。 (语法上)