如何在Rails 4中将javascript_include_tag与js.erb文件一起使用?

时间:2015-08-25 18:17:42

标签: javascript ruby-on-rails ruby ruby-on-rails-4

以下是我的看法:

<%= javascript_include_tag "social_sharing.erb" %>

然后我有:assets/javascripts/social_sharing.erb.js,其中包含一些ERB标记,例如<%= post.id %> ...

第一个问题是我看到此错误消息:

`Asset filtered out and will not be served: add `Rails.application.config.assets.precompile += %w( social_sharing.erb.js )` to `config/initializers/assets.rb` and restart your server

如果我遵循这些指示,那么我会提供js文件,但没有评估任何ERB标记,所以我仍然在链接的js文件中看到<%= post.id %>

2 个答案:

答案 0 :(得分:11)

该文件应命名为assets/javascripts/social_sharing.js.erb(末尾为.erb),否则Rails资产管道不知道如何处理它并将其作为纯JavaScript进行提供。 include标记应该是<%= javascript_include_tag "social_sharing.js" %>而不是.erb,尽管the .js is optional

资产文件夹中的所有内容都将通过asset pipeline进行处理,并可以使用asset helper tags轻松获取。

但是,javascript_include_tag和资产管道是真正的静态资产,只能预编译一次,然后同一个文件随每个相关请求一起提供。如果您尝试包含因请求而异的动态内容(例如<%= post.id %>),您可能希望将.js.erb文件移动到views目录中的某个位置并将其呈现为部分,类似于this question的第一个答案:

<script>
    render partial: '[somewhere]/social_sharing', post: @post
</script>

该文件也需要重命名为_social_sharing.js.erb

答案 1 :(得分:2)

我不确定这是答案,但是你对资产管道所做的与javascript相比看起来很不寻常。

要在资源预编译中包含js,请在/config/initalizers/assets.rb文件中添加此行。

Rails.application.config.assets.precompile += %w( social_sharing.js )  

我认为一旦在资产管道编译中包含此文件,您根本不需要使用javascript_include_tag

如果你试试这个,如果你还有错误和/或渲染问题,请告诉我。