注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研自动组

快乐耕耘,收获成长!

 
 
 

日志

 
 

线上Symbol or String expected as key异常处理  

2011-01-27 17:20:36|  分类: 平台开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

作者:小云 

问题:

线上出现Symbol or String expected as key异常,并且对于当前用户会反复的出现这个问题,异常代码如下:
ActionView::TemplateError (Symbol or String expected as key.) on line #43 of projects/_tabs.rhtml:
40:   <% @projects_tabs.each do |tab| -%>
41:     <li>
42:       <% if tab[:project_action] %>
43:         <%= link_to l(tab[:label]),
44:           {:controller => 'projects', :action => tab[:project_action], :tab_id => tab[:name],
45:           :scope => tab[:scope],
46:           :project_type => tab[:project_type],
    vendor/plugins/gloc-1.1.0/lib/gloc-internal.rb:82:in `_l'
    vendor/plugins/gloc-1.1.0/lib/gloc.rb:19:in `l'
    app/views/projects/_tabs.rhtml:43:in `_run_erb_47app47views47projects47_tabs46rhtml'
    app/views/projects/_tabs.rhtml:40:in `each'
    app/views/projects/_tabs.rhtml:40:in `_run_erb_47app47views47projects47_tabs46rhtml'
    /usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:637:in `send'
    /usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:637:in `compile_and_render_template'

异常是由于link_to l(tab[:label])这句引起的,判断是tab[:label]为nil导致的,通过调试手工把tab[:label]置为nil,能出现相同的错误提示。错误是l()这个方法里面抛出来的,l()不能接受一个nil值。

原因:
这个问题不能重现,因为label一般情况下是不会是nil的,那么label存的是什么东西呢?可以通过代码一步一步的往回找。
1
2
3
4
5
6
7
8
9
10
11
12
13
<% @projects_tabs.each do |tab| -%>
<li
>

<% if tab[:project_action] %>
<%= link_to l(tab[:label]),
{:controller
=
> 'projects', :action => tab[:project_action], :tab_id => tab[:name],
:scope => tab[:scope],
:project_type => tab[:project_type],
:status => tab[:status],
:keyname => tab[:keyname]},
{:id => "tab-#{tab[:name]}",
:class => (tab[:name] == @selected_tab ? 'selected' : nil),
:style => 'padding-right:25px',
:onclick => "showProjectsTab('project_tabs','tab-#{tab[:name]}');"} %>

通过以上的代码发现tab[:label]是@projects_tabs对象中的,那么@projects_tabs对象哪里来呢?在projects/_tabs.rhtml页面中
1
@projects_tabs << session[:new_project_tab] if session[:new_project_tab]

通过上面的代码知道是从session中来的,因为是存在session中,所以也很好的说明了,错误一次以后会频繁的出错,需要退出重新登录以后才不会 出现这个错误。接着找session[:new_project_tab]吧。在projects/_tabs.rhtml页面中
1
2
 session[:new_project_tab] = {:name => '4', :label => @query_name, :action_url => "index", :scope => @scope,
:project_type => @project_type,:status => @status ,:keyname => @keyname, :project_action => 'index' }

从上面的代码中找到了label的来处是@query_name,继续找@query_name吧,在projects_controller的list方法中
1
@query_name = params[:tab_name] if params[:tab_name]

继续找tab_name吧,在projects/_search_bar.rhtml页面
1
 <%= hidden_field_tag('tab_name', '查询结果')%>

通过查询我们发现tab_name字段是一个隐藏域,正常情况下是肯定会有值的,所以不会重现错误,但是也需要对这种错误进行处理,保证下次出现不会异常。

解决方法:
link_to l(tab[:label])方法中去除l()方法,l()方法主要是用于国际化,此处多余,去除后即使tab[:label]为nil也不会出现异常,这时候会自动读取当前的url用于显示链接的名称。

  评论这张
 
阅读(277)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018