在js.erb中的if语句中评估nil时遇到错误

时间:2011-12-01 15:10:42

标签: jquery ruby-on-rails-3 erb null

我在Rails 3.0.10中有一个index.js.erb文件,如下所示:

$('.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'

这不是很奇怪吗? js.erb中的if不应该在发现@sessionnil时停止执行吗?我还在控制器中尝试了@session = false

当我在代码行开头用//的js.erb文件中注释掉代码时,我遇到了类似的问题。代码仍在评估中并产生错误。

有没有我对js.erb-files没有了解的东西?

1 个答案:

答案 0 :(得分:2)

问题是,ERB必须将ERB代码呈现为JS代码,以便ERB在呈现期间评估if块中的表达式(否则它将无法将代码呈现为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 %>