Ruby on rails 3 链轮>;如何为Erb评估/呈现指定绑定?

Ruby on rails 3 链轮>;如何为Erb评估/呈现指定绑定?,ruby-on-rails-3,sprockets,tilt,Ruby On Rails 3,Sprockets,Tilt,我花了很多时间研究Sprocket和tit的源代码,试图找出如何将变量/绑定传递到Erb评估上下文。以下是我试图做的:我需要为一个JS文件提供服务,该文件的内容会根据每个请求进行更改。更改的部分取决于数据库中存储的数据,因此需要通过Rails应用程序路由请求,并且需要传递变量/绑定。除此之外,JS文件使用require指令插入其他JS文件,因此需要使用链轮 以下是不起作用的代码片段: 控制器文件: def ever_changing_js @foobars = Foobar.all My

我花了很多时间研究Sprocket和tit的源代码,试图找出如何将变量/绑定传递到Erb评估上下文。以下是我试图做的:我需要为一个JS文件提供服务,该文件的内容会根据每个请求进行更改。更改的部分取决于数据库中存储的数据,因此需要通过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文件应该是完全静态的;链轮不是用来做你想做的事情的

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

app/assets/javascripts/user.js

app/views/users/show.html.erb

。。。
(功能(){
var user=新用户();
$(“#讲话按钮”)。单击(函数(){
user.speak();
});
})();

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

JavaScript文件应该是完全静态的;链轮不是用来做你想做的事情的

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

app/assets/javascripts/user.js

app/views/users/show.html.erb

。。。
(功能(){
var user=新用户();
$(“#讲话按钮”)。单击(函数(){
user.speak();
});
})();

如果你能给出更多关于你的特定用例的上下文,我可以给出一个更具体的例子。

我正试图完成与你相同的事情。我发现您的控制器代码片段有几个问题。与在
Sprockets::Environment
上执行
instance\u eval
不同,您应该
class\u eval
context\u class
上执行,如中所示

然后,您的ERb模板将可以使用
foobars

作为旁注,你可以

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

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

我正在尝试完成与您相同的任务。我发现您的控制器代码片段有几个问题。与在
Sprockets::Environment
上执行
instance\u eval
不同,您应该
class\u eval
context\u class
上执行,如中所示

然后,您的ERb模板将可以使用
foobars

作为旁注,你可以

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

不要自己设置内容类型。

谢谢您的回答。不幸的是,在我的例子中没有关联的模板文件。让我解释一下。有问题的JS可以被应用程序的不同用户用来在他们的网站上呈现小部件。(想想人们在网站上安装的实时聊天小部件)。现在,每个用户可能都有不同的设置和数据,需要引用到JS文件中。我想将JS的静态部分和动态部分打包到一个文件中并提供服务。这有意义吗?像Google Maps这样的JavaScript API为每个客户端提供相同的JS,并要求客户端实例化他们想要的对象和API。如果您真的想要动态JavaScript文件,请将模板命名为
.JS.erb
,Rails将为请求返回JavaScript的正确MIME类型。它应该存在于
app/views
中,而不是
app/assets
。我不能要求客户端以他们喜欢的方式实例化对象,因为那样会变得太技术化。理想情况下,客户端将使用web UI更改设置,并在其网站中只包含一个JS文件。如果我使用
.JS.erb
文件,我可以在顶部使用
/=require
指令吗?我需要最终的JS文件是3-4个其他JS文件+动态位的串联版本。谢谢你的回答。不幸的是,在我的例子中没有关联的模板文件。让我解释一下。有问题的JS可以被应用程序的不同用户用来在他们的网站上呈现小部件。(想想人们在网站上安装的实时聊天小部件)。现在,每个用户可能都有不同的设置和数据,需要引用到JS文件中。我想将JS的静态部分和动态部分打包到一个文件中并提供服务。这有意义吗?像Google Maps这样的JavaScript API为每个客户端提供相同的JS,并要求客户端实例化他们想要的对象和API。如果您真的想要动态JavaScript文件,请将模板命名为
.JS.erb
,Rails将为请求返回JavaScript的正确MIME类型。它应该存在于
app/views
中,而不是
app/assets
。我不能要求客户端以他们喜欢的方式实例化对象,因为那样会变得太技术化。理想情况下,客户端将使用web UI更改设置,并在其网站中只包含一个JS文件。如果我使用
.JS.erb
文件,我可以在顶部使用
/=require
指令吗?我需要最终的JS文件是3-4个其他JS文件+动态位的串联版本。
MyApp::Application.assets.context_class.class_eval do
  def foobars
    @foobars
  end
end
render js: MyApp::Application.assets.find_asset('ever_changing.js').to_s