链轮 > 如何指定 Erb 评估/渲染的绑定?



我花了很多时间深入研究链轮和tit的源代码,试图找出如何将变量/绑定传递到Erb评估上下文。以下是我要做的:我需要提供一个JS文件,该文件的内容会根据请求而更改。更改的部分取决于存储在DB中的数据,因此需要通过Rails应用程序路由请求,并需要传递变量/绑定。除此之外,JS文件使用require指令插入其他JS文件,因此需要使用链轮。

以下是不起作用的代码片段:

控制器文件:

def ever_changing_js
  @foobars = Foobar.all
  MyApp::Application.assets.instance_eval do
    def foobars
      @foobars
    end
  end
  render :text => MyApp::Application.assets.find_asset('ever_changing.js').to_s, :content_type => "application/javascript"
end

ever_changing.js:

//= require file1.js
//= require file2.js
// Some code that uses @foobars

我该怎么做?如有任何帮助,我们将不胜感激。

JavaScript文件应该是完全静态的;萌芽并不意味着要做你想做的事。

根据每个请求更改的任何数据都应该写入到正在呈现的模板底部的<script>标记中。

app/assets/javascripts/user.js

(function(exports) {
  function User(name) {
    this.name = name;
  }
  User.prototype.speak() {
    console.log(this.name + ' says, "Hello!"');
  };
  exports.User = User;
})(this);

app/views/users/show.html.erb

...
  <%= javascript_include_tag('user') %>
  <script>
    (function() {
      var user = new User(<%= @user.name %>);
      $('#speak-button').click(function() {
        user.speak();
      });
    })();
  </script>
</html>

如果你能围绕你的具体用例给出更多的上下文,我可以举一个更具体的例子。

我正在努力完成与你相同的事情。我看到您的控制器代码片段有几个问题。与其在Sprockets::Environment上执行instance_eval,不如在context_class上进行class_eval,如Sprockets::Context文档中所示。

MyApp::Application.assets.context_class.class_eval do
  def foobars
    @foobars
  end
end

然后foobars将可用于ERb模板。

作为旁注,你可以做

render js: MyApp::Application.assets.find_asset('ever_changing.js').to_s

而不是自己设置内容类型。

最新更新