如何将Rails变量传递给jQuery函数?

时间:2010-11-28 14:15:43

标签: jquery ruby-on-rails variables jrails

我正在制作非常简单的ROR(rails 2.3.5)应用程序并使用jQuery插件jRails。想法是在jQuery youtube播放器中修改午餐,它将播放来自ror控制器列表的随机视频。

controller.rb

    def show
    @clip = Video.find(:all, :select =>'link', :order => 'RANDOM()', :limit => 1).map(&:link)
    respond_to do |format|
      format.html 
     end
  end

show.html.erb

<div id="random">
<%=@clip%>
</div>

此处的链接只是一个随机的YouTube链接。跛脚的问题是如何在这个jQuery函数中获取这个变量?

的application.js

 $(document).ready(function(){
    $('#player').youTubeEmbed("http://www.youtube.com/watch?v=ZDFlmxmBne8")

});

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

保留rails代码并使用jQuery:

$(document).ready(function(){
  $('#player').youTubeEmbed($('#random').text())
});

为了增强可访问性,我将erb更改为:

<div id="random">
<%=link_to h(@clip), h(@clip) %>
</div>

然后是js:

$(document).ready(function(){
  $('#player').youTubeEmbed($('#random a').attr('href'));
  $('#random').hide();
});

答案 1 :(得分:2)

假设变量包含URL,如下所示:

$(document).ready(function(){
    $('#player').youTubeEmbed("<%=escape_javascript(@clip)%>");
});

(很抱歉,错过了JavaScript与HTML不在同一个文件中的事实 - 它也不应该!)

假设变量包含URL,如果您不想显示该URL,则可以将其嵌入页面变量中(使用以下内容替换show.html.erb中的div代码):

<script type='text/javascript'>
window.myStuff = {
    clipUrl: "<%=escape_javascript(@clip)%>"
};
</script>

...(或

<script type='text/javascript'>
var myStuff = {
    clipUrl: "<%=escape_javascript(@clip)%>"
};
</script>

......这几乎是一回事。)

...然后你可以像这样使用它:

$(document).ready(function(){
    $('#player').youTubeEmbed(window.myStuff.clipUrl);
});

以这种方式输出变量的值时,您需要确保写出的内容最终成为有效的JavaScript。例如,如果@clip变量包含"\,则需要确保将"变为\"并且任何单独的反斜杠都变为\\。 Jakub Hampl帮助指出了escape_javascript函数,我已经编辑了代码示例。

这样做意味着我们在window上添加了一个新符号。我把我们的新符号作为一个对象,这样如果我们需要用其他东西做这个,我们可以将它们包含在同一个对象中,这样我们就不会在整个地方都有符号(创建大量的全局符号 - 这就是所以,window属性 - 往往成为维护问题,最好避免)。例如,如果您有两个剪辑:

<script type='text/javascript'>
window.myStuff = {
    someNiftyClip:      "<%=escape_javascript(@clip)%>",
    someOtherNiftyClip: "<%=escape_javascript(@anotherClip)%>"
};
</script>

偏离主题:在调用youTubeEmbed的行中,请注意我在末尾添加了分号。最好不要依赖JavaScript的semicolon insertion

答案 2 :(得分:0)

您可以将变量放在隐藏字段中,然后可以在$('#hiddenFieldID')等函数中使用它.val();