2

Я использую Rails 3.1, кажется, что я не мог использовать скрипт Ruby после выражения CoffeeScript в моем файле для ответа AJAX.ruby ​​не мог прийти после coffeescript в .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. Я пробовал несколько образцов, каждый раз, когда это происходит, когда ruby ​​<% %> приходит после заявления coffeescript.

Почему?

ответ

6

Похоже, вы сталкиваетесь с проблемами с отступом в своем пост-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. Вы можете увидеть это в действии в this snippet on 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

Ваш ответ настолько совершенен! – larryzhao

+0

Привет, я пытался использовать 'error_msgs = <% = @ attach_image.errors.to_a.to_json%>', но я получаю «ActionView :: Template :: Error (зарезервированное слово« var »в строке 1)'.Я что-то еще сделал неправильно? – larryzhao

+0

Попробуйте добавить 'html_safe', чтобы он не кодировал кавычки, см. Мое обновление. –

0

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

create_error.js.coffee.erb 

Таким образом, вы могли бы добавить рубин на нем.

+0

Я нашел этот https://github.com/rails/coffee-rails/issues/13 вчера, который сказал мне использовать js.coffee (без части erb), и на самом деле он отлично работает с частью кода ruby , только процессор coffeescript не пройдет, если есть «<% %>» после одной из заявлений на кофе. Но это работает наоборот, или между ними. Я отредактирую вопрос, чтобы сделать его более понятным. – larryzhao