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

时间:2012-09-15 06:54:53

标签: ruby-on-rails-3 sprockets tilt

我花了很多时间挖掘sprockets'和tit的源代码,试图弄清楚如何将变量/绑定传递给Erb评估上下文。这是我正在尝试做的事情:我需要提供一个JS文件,其内容根据请求进行更改。更改的部分取决于存储在数据库中的数据,因此需要通过Rails应用程序路由请求以及传递变量/绑定的需要。最重要的是JS文件使用require指令插入其他JS文件,因此需要使用sprockets。

以下是无效的代码段:

控制器文件:

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

我怎样才能完成这项工作?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

JavaScript文件应该是完全静态的;链轮并不意味着你要做的事情。

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

应用程序/资产/ Javascript角/ user.js的

(function(exports) {
  function User(name) {
    this.name = name;
  }

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

  exports.User = User;
})(this);

应用程序/视图/用户/ show.html.erb

...

  <%= javascript_include_tag('user') %>
  <script>
    (function() {
      var user = new User(<%= @user.name %>);

      $('#speak-button').click(function() {
        user.speak();
      });
    })();
  </script>
</html>

如果您可以提供有关特定用例的更多上下文,我可以提供更具体的示例。

答案 1 :(得分:0)

我正在努力完成同样的事情。我看到你的控制器代码片段存在一些问题。不应在instance_eval上执行Sprockets::Environment,而应class_eval context_class MyApp::Application.assets.context_class.class_eval do def foobars @foobars end end ,如Sprockets::Context documentation所示。

foobars

然后{ER}模板可以使用render js: MyApp::Application.assets.find_asset('ever_changing.js').to_s

作为旁注,你可以做到

{{1}}

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