ruby не может прийти после coffeescript в .js.coffee для ответа ajax - PullRequest
2 голосов
/ 02 февраля 2012

Я использую Rails 3.1, похоже, что я не смог использовать скрипт Ruby после оператора CoffeeScript в моем create_error.js.coffee файле просмотра для ответа AJAX.

Если я сделаю так, он будет работать:

<% if @attached_image.errors.any? %>
  alert 'something is wrong'
<% end %>

но если это похоже на следующее, с <% %> после оператора CoffeeScript,

errors_block = '<div id="errors_block"></div>'
<% if @attached_image.errors.any? %>
  something..
<% end %>

Я всегда получу исключение ActionView::Template::Error (Parse error on line 6: Unexpected 'INDENT') на if линия.Я пробовал несколько примеров, каждый раз, когда это происходит, когда после оператора coffeescript появляется ruby ​​<% %>.

Почему это так?

Ответы [ 2 ]

6 голосов
/ 02 февраля 2012

Звучит так, как будто вы столкнулись с проблемами отступов в вашем после-ERB CoffeeScript.Учитывая это:

errors_block = '<div id="errors_block"></div>'
<% if @attached_image.errors.any? %>
  something...
<% end %>

Вывод будет выглядеть так, когда условие if выполнено:

errors_block = '<div id="errors_block"></div>'

  something...

, и этот отступ запускает новый блок, который не имеет смысла вэтот контекст;следовательно, ошибка «Неожиданный« INDENT »от компилятора CoffeeScript.Вы можете увидеть это в действии в этом фрагменте на coffeescript.org .

CoffeeScript очень чувствителен к отступам, поэтому смешивать ERB и CoffeeScript, как это, не очень хорошая идея.Лучше было бы поместить @attached_image.errors в переменную CoffeeScript и затем выполнить логику в CoffeeScript, что-то вроде этого (непроверенный код):

errors = <%= @attached_image.errors.to_a.to_json.html_safe %>
errors_block = '<div id="errors_block"></div>'
if errors.length > 0
  something...

Версия массива ошибок JSON должна быть действительнойCoffeeScript, поэтому errors будет массивом CoffeeScript.to_a есть в случае, если errors вернет nil, я не уверен, что на макушке, если errors.nil? возможно, но небольшая дополнительная паранойя никогда никому не повредит.

Вы могли бытакже сделайте это:

errors_block = '<div id="errors_block"></div>'
<% if @attached_image.errors.any? %>
something..
<% end %>

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

0 голосов
/ 02 февраля 2012

Ваш файл должен называться:

create_error.js.coffee.erb

Так что вы можете добавить к нему рубин.

...