ActionView :: Template:Error(未定义的方法'first_name'代表nil:NilClass)

时间:2012-01-04 05:58:37

标签: ruby-on-rails-3 ruby-on-rails-3.1

当用户尝试将网格数据加载到表单中时,我的应用似乎随机抛出错误:

   ActionView::Template::Error (undefined method `first_name' for nil:NilClass):
3:          t = @conts
4:                          xml.tag!("row",{ "id" => t.id }) do
5:
6:                                  xml.tag!("cell", t.first_name)
7:                                  xml.tag!("cell", t.last_name)
8:                          xml.tag!("cell", t.email)
9:                                  xml.tag!("cell", t.phone_1)

以下是控制器文件

 def compdata
       @conts = Continfo.find_by_id(params[:id])
    end

通信compdata RXML文件

     xml.instruct! :xml, :version=>"1.0" 
       xml.tag!("rows") do
     t = @conts
        xml.tag!("row",{ "id" => t.id }) do

            xml.tag!("cell", t.first_name)
            xml.tag!("cell", t.last_name)
            xml.tag!("cell", t.email)
            xml.tag!("cell", t.phone_1)
            xml.tag!("cell", t.phone_2)
            xml.tag!("cell", t.homepage)
            xml.tag!("cell", t.skype)
    end
end

1 个答案:

答案 0 :(得分:0)

第一项

现在看起来你还有一些其他类似的问题(herehere),对于当前的一个和这一个,看起来你的@conts值是目前nil表示在运行搜索时没有收回任何内容:

def compdata
  @conts = Continfo.find_by_id(params[:id])
end

您确定表格中有id等于params[:id]的值?

如果那里不匹配,那将是我看的第一个地方。

第二项

您尝试在each上调用@conts方法时可能会遇到问题,因为find_by_id方法将带回数组。如果您希望迭代每条记录而不是每个键/值,请尝试使用find_all_by_id,它将返回数组

第三项

在查看了您的其他问题之后,看起来您的语法不同,但是您不应该像这样再次迭代@conts吗?

xml.tag!("rows") do
  @conts.each do |t|
    xml.tag!("row",{ "id" => t.id }) do
      xml.tag!("cell", t.first_name)
      xml.tag!("cell", t.last_name)
      xml.tag!("cell", t.email)
      xml.tag!("cell", t.phone_1)
      xml.tag!("cell", t.phone_2)
      xml.tag!("cell", t.homepage)
      xml.tag!("cell", t.skype)
    end
  end
end

这是分配t而非t = @conts的方式,特别是如果您计划逐步完成其中的许多内容。