Проблема с ошибкой при оценке nil в операторе if в js.erb - PullRequest
1 голос
/ 01 декабря 2011

У меня есть файл index.js.erb в Rails 3.0.10, который выглядит следующим образом:

$('.loading').hide()
if ("<%= @id %>" && "<%= @session %>") {
  alert("<%= @id %> <%= @session[:open] %>")
}

Соответствующая часть контроллера выглядит так:

if @element != "chkbx"
  @session[:open] = !@session[:open]
else
  @session = nil
end

@id = params[:id] 

Когда @element != "chkbx", все работает нормально, но в противном случае я получаю эту ошибку:

    ActionView::Template::Error (You have a nil object when you didn't expect it!
    You might have expected an instance of Array.
    The error occurred while evaluating nil.[]):
        1: $('.loading').hide()
        2: if ("<%= @id %>" && "<%= @session %>") {
        3:  alert("<%= @id %> <%= @session[:open] %>")
        4: }
        5: 
        6: 
        app/views/search/index.js.erb:3:in `_app_views_search_index_js_erb___1015507201_70338196455640_0'
        app/controllers/search_controller.rb:32:in `index'

Разве это не очень странно?Не следует ли прекратить выполнение if в js.erb, когда обнаружит, что @session равно nil?Я также пытался с @session = false в контроллере.

У меня похожая проблема, когда я закомментировал код в js.erb-файле с // в начале строки кода.Код все еще оценивается и выдает ошибки.

Что-то я не понял в js.erb-файлах?

1 Ответ

2 голосов
/ 01 декабря 2011

Дело в том, что ERB должен преобразовать код ERB в код JS, чтобы выражение в блоке if оценивалось ERB во время рендеринга (в противном случае он не смог бы преобразовать код в JS).

Теперь, если у вас был ТОЛЬКО код JS, подобный следующему:

$('.loading').hide()
if (id && session) {
  alert(something);
}

Тогда да, что-то было бы странным, если бы он вычислял что-либо в блоке if, потому что он должен был сбоить session.

Я бы просто немного переписал ваш код:

$('.loading').hide()
if ("<%= @id %>" && "<%= @session %>") {
    <% if @session %>
        alert("<%= @id %> <%= @session[:open] %>")        
    <% end %>
}

Кстати, закомментированный код все еще должен оцениваться ERB во время рендеринга.Поэтому, если вы собираетесь закомментировать его в файле .js.erb, вам нужно закомментировать его с использованием синтаксиса ERB, а не Javascript.

<% 
=begin %>
  $('.loading').hide()
  if ("<%= @id %>" && "<%= @session %>") {
      <% if @session %>
          alert("<%= @id %> <%= @session[:open] %>")        
      <% end %>
  }
<% 
=end %>

Или для отдельных строк кода:

<%# your_ruby_code_goes_here %>
...