我在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不应该在发现@session
为nil
时停止执行吗?我还在控制器中尝试了@session = false
。
当我在代码行开头用//
的js.erb文件中注释掉代码时,我遇到了类似的问题。代码仍在评估中并产生错误。
有没有我对js.erb-files没有了解的东西?
答案 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 %>