Rails:在CoffeeScript或JavaScript资产文件中访问控制器实例变量

Saf*_*lai 41 controller ruby-on-rails erb instance-variables coffeescript

在Rails 3.1中,无法使用诸如<%= @ foo%>之类的语法访问资产js.erb或coffee.erb文件中的控制器实例变量,其中@foo在控制器中设置.那么问题是将控制器变量传递给CoffeeScript或JavaScript资产的最佳方法是什么.

这个问题在论坛上有多种复杂形式的问题,但我再次提出这个问题的意思是要有一个所有建议聚集在一起的地方,并且所提供的代码简单易读.另请注意,我特指的是资产,而不是查看响应文件.

hou*_*se9 28

我过去做过这几种方式

将数据放入隐藏字段,访问js/coffee中的数据

# single value
<%= hidden_field_tag "foo_name", @foo.name, { :id => "foo-name" } %>
$('#foo-name').val();

# when the 'value' has multiple attributes
<%= hidden_field_tag "foo", @foo.id, { :id => "foo", "data-first-name" => @foo.first_name, "data-last-name" => @foo.last_name } %>
$foo = $('#foo')
console.log $foo.val()
console.log $foo.data("firstName")
console.log $foo.data("lastName")
Run Code Online (Sandbox Code Playgroud)

另一种选择:将数据加载到erb中的js数据结构中,从js/coffee访问它

<% content_for(:head) do %>
    <script>
    window.App = window.App || {};
    window.App.Data = window.App.Data || {};
    window.App.Data.fooList = [
        <% @list.each do |foo| %>
            <%= foo.to_json %>,
        <% end %>
    ];
    </script>
<% end %>


# coffee
for foo in window.App.Data.fooList
    console.log "#{foo.id}, #{foo.first_name} #{foo.last_name}"
Run Code Online (Sandbox Code Playgroud)

我不是像这样在erb中构建来自ruby的javascript数据的忠实粉丝,关于它的一些事情只是感觉不对 - 虽然它可以有效但

和另一个选择:进行ajax调用并从服务器按需获取数据

我也对其他想法和方法感兴趣


Max*_*Max 9

有一个非常好的铁路演员和最近的(2012年2月)关于这个特定主题: #324将数据传递给JavaScript

它显示了3种方式:脚本标记,数据属性和Gon gem.我认为房子涵盖了所有可用的技术.我只会提到,当您拥有大量数据,动态数据或两者的组合时,最好使用AJAX调用.

  • 你能在答案中添加一些示例代码吗? (2认同)

Dav*_*son 5

我选择将数据属性添加到jquery可以获取的容器div中,而不是使用隐藏字段.

<div class="searchResults" data-query="<%= @q %>"></div>
Run Code Online (Sandbox Code Playgroud)

然后jquery访问它

url: "/search/get_results?search[q]=" + $(".searchResults").data("query") + "&page=" + p
Run Code Online (Sandbox Code Playgroud)

我觉得这是将数据传递给javascript的最简洁方法.在找不到将变量传递给带有来自控制器的rails资产管道的咖啡脚本文件之后.这是我现在使用的方法.不能等到有人用最好的导轨设置控制器方式.