Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby ExecJS:在两个调用之间保持上下文_Ruby_Execjs - Fatal编程技术网

Ruby ExecJS:在两个调用之间保持上下文

Ruby ExecJS:在两个调用之间保持上下文,ruby,execjs,Ruby,Execjs,我目前正在尝试使用ExecJS为我所使用的一款产品运行Handlebars(注意:我知道Handlebars.rb gem非常酷,我曾经使用过它,但是在Windows上安装它有一些问题,所以我尝试了另一个自制的解决方案) 我遇到的一个问题是,Javascript上下文没有保留在对ExecJS的每次“调用”之间 下面是我实例化@js属性的代码: class Context attr_reader :js, :partials, :helpers def initialize sr

我目前正在尝试使用ExecJS为我所使用的一款产品运行Handlebars(注意:我知道Handlebars.rb gem非常酷,我曾经使用过它,但是在Windows上安装它有一些问题,所以我尝试了另一个自制的解决方案)

我遇到的一个问题是,Javascript上下文没有保留在对ExecJS的每次“调用”之间

下面是我实例化@js属性的代码:

class Context
  attr_reader :js, :partials, :helpers

  def initialize
    src = File.open(::Handlebars::Source.bundled_path, 'r').read
    @js = ExecJS.compile(src)
  end
end
这里有一个测试显示了这个问题:

let(:ctx) { Hiptest::Handlebars::Context.new }

it "does not keep context properly (or I'm using the tool wrong" do
  ctx.js.eval('my_variable = 42')
  expect(ctx.js.eval('my_variable')).to eq(42)
end
现在当我运行它时:

rspec spec/handlebars_spec.rb:10                                                                   1 ↵
I, [2015-02-21T16:57:30.485774 #35939]  INFO -- : Not reporting to Code Climate because ENV['CODECLIMATE_REPO_TOKEN'] is not set.
Run options: include {:locations=>{"./spec/handlebars_spec.rb"=>[10]}}
F

Failures:

  1) Hiptest::Handlebars Context does not keep context properly (or I'm using the tool wrong
     Failure/Error: expect(ctx.js.eval('my_variable')).to eq(42)
     ExecJS::ProgramError:
       ReferenceError: Can't find variable: my_variable
注意:我对“exec”而不是“eval”有同样的问题

这是一个愚蠢的例子。我真正想做的是运行“handlebar.registerPartial”和后面的“handlebar.compile”。但是当尝试在模板中使用partials时,它失败了,因为以前注册的部分丢失了

请注意,我已经找到了一个解决方法,但我发现它非常难看:/

  def register_partial(name, content)
    @partials[name] = content
  end

  def call(*args)
    @context.js.call([
      "(function (partials, helpers, tmpl, args) {",
      "  Object.keys(partials).forEach(function (key) {",
      "    Handlebars.registerPartial(key, partials[key]);",
      "  })",
      "  return Handlebars.compile(tmpl).apply(null, args);",
      "})"].join("\n"), @partials, @template, args)
  end

您知道如何解决这个问题吗?

只有在调用
ExecJS.compile
时创建的上下文才会在evals之间保留。任何需要保留的内容都需要作为初始编译的一部分。

谢谢您的解释。很抱歉,现在选择您的答案:/