2010-11-28 4 views
1

Я делаю очень простое приложение ROR (rails 2.3.5) и используя jQuery плагин jRails. Идея состоит в том, чтобы пообедать в jQuery youtube player, который будет воспроизводить случайные видео из списка контроллера ror.Как передать переменную Rails функции jQuery?

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"> 
<%[email protected]%> 
</div> 

Ссылка здесь просто случайная ссылка на YouTube, например. Вопрос о том, как получить эту переменную в этой функции jQuery?

application.js

Был бы очень благодарен за любую помощь.

+0

Как выглядит ваш обработанный вывод? – 2010-11-28 14:17:34

ответ

4

Оставьте свой Рельсы код как и в JQuery использования:

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

В целях повышения доступности Я изменил бы Еврорадио к:

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

и затем ЯШ:

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

Предполагая, что переменная содержит URL, например:

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

(К сожалению, пропустили тот факт, что JavaScript не был в том же файле, что и HTML - а он не должен» т быть!)

Assuuming переменных содержат URL, если вы не хотите, чтобы URL показаны, вы можете вставлять его в переменных страницах, как это (замените div код в show.html.erb со следующим):

<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 содержит " или \, вам необходимо убедиться, что " превращен в \" и что любая одиночная обратная косая черта превращается в \\. Якуб Хампл с благодарностью указал на функцию escape_javascript для этого, которую я редактировал в примерах кода.

Выполнение этого означает, что мы помещаем новый символ на window. Я сделал наш новый символ объектом, так что, если нам нужно сделать это с другими вещами, мы можем включить их в тот же объект, чтобы мы не оставались символами повсеместно (создавая множество глобальных символов —, который является так, window свойства   — имеет тенденцию стать проблемой обслуживания, лучше всего избегать).Так, например, если у вас два клипов:

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

Off темы: В линии вызывающей youTubeEmbed, обратите внимание, я добавил точку с запятой в конце. Лучше не полагаться на JavaScript semicolon insertion.

+1

Используйте `escape_javascript` для этого aproach. `@ clip` может быть что-то вроде` http://youtu.be/";alert('evil code here '); ". – 2010-11-28 14:36:42

+0

@Jakub: Спасибо. Я упомянул о важности побега, но я не очень люблю Railshead, поэтому не знал о фактической функции. Теперь я это сделаю, отредактировал и связал с ним для OP. Еще раз спасибо! – 2010-11-28 14:42:40

0

Вы можете поместить переменную в скрытое поле, тогда вы можете использовать ее в функции типа $ ('# hiddenFieldID'). Val();

Смежные вопросы