Rails 4 - 将View内部的js内联脚本移动到JS文件中

时间:2016-10-26 21:24:19

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

我想将我主页上的一些js内联脚本移动到javascript文件(在Assets中),但由于变量存在一些复杂性。

home.html.erb

<div>
this is the homepage
</div>
<script>
  <% @deal.deal_details.each_with_index do |popin, index| %>
  <% index_plus_one = index + 1 %> 
    function loadInfoPopin() {
      var msg;
      msg = Messenger().post({
        message:  '<%= j render partial: "deals/info_popin/info_popin#{ popin['popin_id'] }",
                  locals: { popin: popin, index: index_plus_one } %>'
      });
    } 
  <% end %>
</script>

为了便于获取信息,这里是Deal的列/属性'deal_details'的格式(它是一个json属性):

[{"popin_id":"4","text1":"qqq","text2":"sqsq","image1":"sqqs"},{"popin_id":"5","text1":"sqqs","video1":"s"}] 

这是一个例子,您可以在数组中尽可能多地使用json块。

deals / info_popin / info_popin5.html.erb(这是一个例子)

<div>
       <p><a href="<%= popin['image1'] %>">cool image</a></p>
    </div>
</div> 

现在,我如何将整个脚本或至少函数loadInfoPopin()移动到javascript文件(也就是说远离视图home.html.erb)?

由于

2 个答案:

答案 0 :(得分:1)

如何将loadInfoPopin()函数移动到单独的JS文件中并稍微改变函数以获取html消息的参数?

function loadInfoPopin(html_message) {
  Messenger().post({
    message:  html_message
  });

在传入并调用loadInfoPopin之前,在循环内设置消息的html。

答案 1 :(得分:0)

.js.erb是一个选项。这样在编译之前将解析js文件。不确定它会以你想要的方式工作。

我建议将布局中的变量保留为vars,并仅将静态JS部件移动到资产。