Переменные Rails не работают в коде JavaScript

0

В одном из моих партитур Rails, в котором у меня есть доступ к модели Folder, некоторые JavaScript, как ни странно, не работают. Модель Folder имеет экземпляры модели Submission которые принадлежат ей. Пример JSON для экземпляра папки выглядит следующим образом:

{"created_at":"2013-09-24T18:55:54Z","id":2,"parent_id":null,"title":"Tumblr Drafts","updated_at":"2013-09-24T18:55:54Z","user_id":1,
"submissions":
[{"content":"This is a test.","created_at":"2013-09-30T23:00:00Z","folder_id":2,"id":93,"parent_id":null,"title":null,"updated_at":"2013-09-30T23:00:00Z","user_id":1}],"children":[]}

Как вы можете видеть, заявки включены в JSON. Действие контроллера выглядит следующим образом:

    def show
        respond_to do |format|
            format.html
            format.js
            format.json {render :json => @folder.as_json( :include => [:submissions, :children])}
        end
    end

Однако, когда я пытаюсь запустить этот JavaScript, он не возвращает console.log:

<script type="text/javascript">
      var wordCount = 0;
      <% @folder.submissions.each do |submission| %>
        var words = <%= submission.content %>.split(' ');
        wordCount += words.length;
      <% end %>
      console.log(wordCount);
    </script>

Я использую переменную @folder всюду в части, о которой идет речь, и она работает. Я даже могу выводить заголовки всех представлений в теги <p>. Может быть, потому что поле содержимого может быть пустым, поэтому иногда оно возвращает null?

1 ответ

1
Лучший ответ

Ваша проблема здесь:

var words = <%= submission.content %>.split(' ');

Это приведет к сбросу вашего значения submission.content в ваш JavaScript без каких-либо цитирования, чтобы вы в итоге сказали такие вещи, как:

var words = blah blah blah.split(' ');

и что недействительный JavaScript. Вам нужно процитировать эту строку и правильно ее избежать:

// You may or may not want submission.content HTML encoded so
// you might want submission.content.html_safe instead.
var words = '<%=j submission.content %>'.split(' ');

Или лучше, просто сделайте все это в Ruby, а не отправляйте в браузер кучу броского текста:

<script type="text/javascript">
  var wordCount = <% @folder.submissions.map { |s| submission.content.split.length }.sum %>
  console.log(wordCount);
</script>

Это предполагает, что ваш JavaScript .split(' ') действительно предназначен для разделения на /\s+/ а не только на отдельные пробелы, конечно.

  • 0
    Ааа да Не могу поверить, что я не заметил, что я делал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню