ruby vs js конкатенация строк в рельсах - PullRequest
2 голосов
/ 28 февраля 2011

поэтому в моем файле show.html.erb для контроллеров, которые у меня были

<% content_for :head do %>
<script type="text/javascript"> 
var filepath= "/flexpaper/" + <%=  @exam.filename.to_s %> + ".swf"

        var flashvars = { 
              SwfFile : escape(filepath), ....

теперь это казалось обходным решением, которое я использовал, но когда я пытался достичь того же результата, все наоборот

<% content_for :head do %>
    <script type="text/javascript"> 
    var filepath= <%= "/flexpaper/" +  @exam.filename + ".swf".to_s  %>

            var flashvars = { 
                  SwfFile : escape(filepath), ....

т.е. для создания пути к файлу в ruby, а не в javascript Я получаю неопределенную ошибку для filepath. теперь я понимаю, что это из-за escape, поскольку он не получил filepath в виде строки i.r "вещи ..", скорее что-то вроде вещи ... так что вырвались ошибки. но я не понимаю почему? есть идеи?

P.s- также любые предложения по организации стиля UJS. У меня есть все остальные js, находящиеся где-то в другом файле и включенные в заголовок по мере необходимости, за исключением этого несколько динамического. Я не могу иметь код ruby ​​во включенных js-файлах и не хотел иметь контроллер javascript, как Райан Бейтс railscast для генерации этого второстепенного скрипта. Так что любое другое простое решение.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

По сути, вам не хватает кавычек в вашем JavaScript во второй версии.После запуска рубина созданная страница содержит тег сценария с чистым JavaScript.Этот javascript выглядит следующим образом:

var filepath= /flexpaper/some_exam.swf
    var flashvars = { 
      SwfFile : escape(filepath), ....

Обратите внимание, что вы присваиваете значение переменной filepath, но оно не заключено в кавычки.Это не допустимый JavaScript.Если вы исправите это следующим образом, оно должно работать:

<% content_for :head do %>
  <script type="text/javascript"> 
    var filepath= "<%= "/flexpaper/" +  @exam.filename + ".swf".to_s  %>";
    var flashvars = { 
       SwfFile : escape(filepath), ....

Пока я занимался этим, я добавил точку с запятой и исправил ваш отступ - вы обнаружите, что при правильном отступе вашего кода javascript он становится порядкаВеличину проще отлаживать.Этот код ruby ​​создаст javascript, который выглядит примерно так:

  <script type="text/javascript"> 
    var filepath= "/flexpaper/some_exam.swf";
    var flashvars = { 
       SwfFile : escape(filepath), ....

Хитрость для выявления ошибок, подобных этой, заключается в создании источника просмотра в вашем браузере и внимательном рассмотрении создаваемого javascript.

0 голосов
/ 28 февраля 2011

Я вижу пару ошибок из вашего кода, в обоих решениях вы пропускаете кавычки, из-за которых текст становится строкой. В первом вы можете сделать так:

<% content_for :head do %>
  <script type="text/javascript"> 
    var filepath= "/flexpaper/<%=  @exam.filename.to_s %>.swf"

    var flashvars = { 
          SwfFile : escape(filepath), ....

А во втором вам не хватает кавычек для всей строки

<% content_for :head do %>
  <script type="text/javascript"> 
    var filepath= "<%= "/flexpaper/" +  @exam.filename + ".swf".to_s  %>"

        var flashvars = { 
              SwfFile : escape(filepath), ....
...