В одном из моих партитур 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?
Ваша проблема здесь:
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+/
а не только на отдельные пробелы, конечно.