2011-12-01 78 views
1

在if语句评估无我有Rails的3.0.10的index.js.erb的文件,该文件是这样的:故障,错误,而在js.erb

控制器的相关部分是像这样:

if @element != "chkbx" 
    @session[:open] = [email protected][: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文件?

回答

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 %> 
} 

顺便说一句,注释掉的代码仍然必须由该局进行评估渲染以及期间。因此,如果您要在.js.erb文件中对其进行注释,则需要使用ERB的语法将其注释掉,而不是使用Javascript。

​​

或者单行代码:

<%# your_ruby_code_goes_here %> 
+0

感谢的很多!这是非常可以理解的!现在它正在工作。 :-)不得不从'<%= if'和'<%= end'中删除=。 –

+0

对不起,我使用HAML,所以我不是很擅长ERB语法:) – iwasrobbed