在Ruby中加载带有变量的YAML文件

在Ruby中加载带有变量的YAML文件,ruby,yaml,erb,chatbot,Ruby,Yaml,Erb,Chatbot,我正在构建聊天机器人,并将我的“回复”存储在下面的Yaml文件中: # say_hello.yml - reply_type: text text: "Welcome <%= @user.first_name %>" - reply_type: delay duration: 2 - reply_type: text text: "We're here to help you learn more about something or another." - reply

我正在构建聊天机器人,并将我的“回复”存储在下面的Yaml文件中:

# say_hello.yml

- reply_type: text
  text: "Welcome <%= @user.first_name %>"
- reply_type: delay
  duration: 2
- reply_type: text
  text: "We're here to help you learn more about something or another."
- reply_type: delay
  duration: 2
然而,当我运行这个命令时,我在@user的first_name上得到了一个“undefined method”错误。如果我在控制台中运行相同的代码,它就会工作

如何定义@user这样的变量,然后正确加载YAML文件?

我建议使用而不是ERB

这使得YAML文件中的语法更简单

- reply_type: text
  text: "Welcome %{user_name}"
和一个简单的读取方法

@user = User.find(user_id)
replies = YAML.load(
  File.read("app/bot/replies/say_hello.yml") % { user_name: @user.first_name }
)
我建议使用替代ERB

这使得YAML文件中的语法更简单

- reply_type: text
  text: "Welcome %{user_name}"
和一个简单的读取方法

@user = User.find(user_id)
replies = YAML.load(
  File.read("app/bot/replies/say_hello.yml") % { user_name: @user.first_name }
)

我找到了一种使用绑定的方法。YAML载重线具有以下特点,其工作原理非常好:

replies = YAML.load(ERB.new(File.read("app/bot/replies/say_hello.yml")).result(binding))

我找到了一种使用绑定的方法。YAML载重线具有以下特点,其工作原理非常好:

replies = YAML.load(ERB.new(File.read("app/bot/replies/say_hello.yml")).result(binding))

这到底是什么错误?nil:NilClass的未定义方法名?是的,很抱歉,完全错误:nil:NilClass的未定义方法“first_name”这到底是什么错误?nil:NilClass的未定义方法名?是的,很抱歉,完全错误:nil:NilClass的未定义方法“first_name”这很好,但理想情况下我想传入@user变量s oI可以调用@user.first_name或@user.last_name,而不必首先定义所有内容。找到了一种使用绑定的方法。。。你觉得怎么样?这很好,但理想情况下我想传入一个@user变量s oI可以调用@user.first\u name或@user.last\u name,而无需定义所有内容。我首先找到了一种使用绑定的方法。。。你觉得呢?那是另一种选择。取决于谁在管理YAML文件。非开发人员的外部翻译器可能会搞乱ERB,因为它们的语法有点复杂。如果您不能信任YAML文件的编辑器,可能会导致安全问题。@MikeHolford这里绑定的是什么?我还试图在.yml.erb文件中传递一些变量。你能提供详细情况吗?那是另一种选择。取决于谁在管理YAML文件。非开发人员的外部翻译器可能会搞乱ERB,因为它们的语法有点复杂。如果您不能信任YAML文件的编辑器,可能会导致安全问题。@MikeHolford这里绑定的是什么?我还试图在.yml.erb文件中传递一些变量。你能提供详细情况吗?