Ruby on rails 在这种情况下,我如何避免评估

Ruby on rails 在这种情况下,我如何避免评估,ruby-on-rails,ruby,Ruby On Rails,Ruby,在编写title_标记帮助程序时,我希望具有以下yml文件结构 index: Hello {{@game.name}} edit: Edit {{@game.name}} - {{@game.classification}} 然后,我使用I18n翻译字符串,需要用实际上下文替换{{var}} title = I18n.t "title_tags.#{namespace}.#{controller_name}.#{action_name}", default: "" title.scan(/\

在编写title_标记帮助程序时,我希望具有以下yml文件结构

index: Hello {{@game.name}}
edit: Edit {{@game.name}} - {{@game.classification}}
然后,我使用I18n翻译字符串,需要用实际上下文替换{{var}}

title = I18n.t "title_tags.#{namespace}.#{controller_name}.#{action_name}", default: ""

title.scan(/\{\{.*?\}\}/).each do |replace|
  # transform {{@game.name}} => @game.name
  var = replace.gsub(/\{|\}/, "")
  title.gsub! replace, eval(var)
end      
这是相当甜蜜的工作。另一方面,用户可能会上传一些名为“system(rm-rf/*)”的游戏,这可能会给我们带来一些真正的危险

有没有可能让它以更安全的方式运行

编辑 多亏了阿克塞尔,我可以用这些酷东西结束

 title.scan(/\{\{.*?\}\}/).each do |replace|
    var = replace.gsub(/\{|\}/, "")                        

    # catch "resource" (like resource-controller)
    if var.starts_with? "resource"
      @tempresource = resource
      var.gsub!("resource", "@tempresource")
    end

    # @game or @game.name
    if var.starts_with?("@")          
      content = var.split('.').inject(nil){|clazz, method| clazz.nil? ? instance_variable_get(method) : clazz.send(method)}
      title.gsub! replace, content
    end
  end

工作出色

您可以使用发送而不是评估:

content = var.split('.').inject(nil){|clazz, method| clazz.nil? ? instance_variable_get(method) : clazz.send(method)}
title.gsub! replace, content

看看我对liquid的了解,并阅读parser.rb的代码。我真的不知道他们是怎么做的。看起来他们编写了一个与eval相当的函数。也许你有更深层次的了解。顺便说一句:来自walle的欢呼:-)我想建议您在项目中使用Liquid,而不是自己重新实施;-)这是“显而易见的”。显然,我已经尝试过Liquid::Template.parse(“Hallo{{@game.name}”)。render返回“Hallo”。也许我在如何使用液体这一点上弄错了。用局部变量做这件事有什么想法吗?i、 e string=“你好{{player}”?幸运的是,我们不应该在yml文件中包含这些内容,但您永远不知道…
Binding\35; local\u variable\u get