rails 3,nil的未定义方法`eq':NilClass

时间:2011-08-18 16:22:25

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

我正在创建脚手架pucgrupo

rails g scaffold pucgrupo numero:integer clase_id:integer nombre:string
编辑我的迁移后

class CreatePucgrupos < ActiveRecord::Migration
  def self.up
    create_table :pucgrupos , :id => false do |t|
      t.integer :numero
      t.integer :clase_id
      t.string :nombre

      t.timestamps
    end
  end

  def self.down
    drop_table :pucgrupos
  end
end

并弹出迁移

rake db:migrate

在我尝试创建组后,我收到此错误:

NoMethodError in PucgruposController#show

undefined method `eq' for nil:NilClass
Rails.root: /home/andres/desarrollos/rubyonrails/proyecto

Application Trace | Framework Trace | Full Trace
app/controllers/pucgrupos_controller.rb:16:in `show'
Request

Parameters:

{"id"=>"0"}

我认为这对于列不存在“id”的任何想法?

1编辑

我正在编辑迁移primary_key numero:

class CreatePucgrupos < ActiveRecord::Migration
  def self.up
    create_table :pucgrupos, :id => false , :primary_key => :numero do |t|
      t.integer :numero
      t.integer :clase_id
      t.string :nombre
      t.timestamps
    end
  end

  def self.down
    drop_table :pucgrupos
  end
end

将数据插入表中,但得到相同的错误。

2编辑

编辑迁移:

create_table :pucgrupos, :primary_key => :numero do |t|
  t.integer :numero
  t.integer :clase_id
  t.string :nombre
  t.timestamps
end

错误显示页面是:

NoMethodError in PucgruposController#show

undefined method `eq' for nil:NilClass
Rails.root: /home/andres/desarrollos/rubyonrails/proyecto

Application Trace | Framework Trace | Full Trace
app/controllers/pucgrupos_controller.rb:16:in `show'
Request

Parameters:

{"id"=>"1"}

3编辑

我正在编辑pucgrupos_controller.rb方法显示是

  def show
    @pucgrupo = Pucgrupo.find_by_numero(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @pucgrupo }
    end
  end

错误显示页面

ActionController::RoutingError in Pucgrupos#index

Showing /home/andres/desarrollos/rubyonrails/proyecto/app/views/pucgrupos/index.html.erb where line #18 raised:

No route matches {:controller=>"pucgrupos", :action=>"show", :id=>#<Pucgrupo numero: 1, clase_id: 2, nombre: "aaa", created_at: "2011-08-18 17:13:07", updated_at: "2011-08-18 17:13:07">}
Extracted source (around line #18):

15:     <td><%= pucgrupo.numero %></td>
16:     <td><%= pucgrupo.clase_id %></td>
17:     <td><%= pucgrupo.nombre %></td>
18:     <td><%= link_to 'Show', pucgrupo %></td>
19:     <td><%= link_to 'Edit', edit_pucgrupo_path(pucgrupo) %></td>
20:     <td><%= link_to 'Destroy', pucgrupo, :confirm => 'Are you sure?', :method => :delete %></td>
21:   </tr>

我输入rails console并输入

Pucgrupo.find_by_numero(1)
=> #<Pucgrupo numero: 1, clase_id: 2, nombre: "aaa", created_at: "2011-08-18 17:13:07", updated_at: "2011-08-18 17:13:07">

4 个答案:

答案 0 :(得分:2)

似乎你不想使用整数“id”作为键,你必须改变

Pucgrupo.find(params[:id])

在行动中PucgruposController #show to

Pucgrupo.find_by_numero(params[:id])

答案 1 :(得分:1)

最后一个错误是由于您已经替换了默认主键但没有通知它的轨道。

当帮助程序尝试为您的show动作生成URL时,视图中的第18行会生成错误。尝试添加此行

primary_key :numero

到您的模型类。我通过这种方式你可以使用find调用,问题应该解决。

BTW有人指出,更改默认主键名称通常是一个坏主意,如果出现问题会导致这种情况发生。

修改

回答您的评论,是的,遵循框架约定总是更好,RoR基于约定优于配置范例,因此您应该遵循这些约定,除非您有充分的理由去更改它们(例如遗产具有现有数据的数据库)。这就是说,即使你改变某些惯例,你也必须知道这样做的所有后果,你只有经验才能获得这些知识。

在您的情况下,主键用于find方法,URL生成,foreign_key查找等。此外,一些第三方宝石可能依赖于id字段并可能停止工作。

如果您确实想要更改主键,则必须通知模型类(使用上面的语句)以及与所涉及的类具有fk关系的其他模型。

答案 2 :(得分:0)

好。您没有创建id列。如果需要,请删除以下行

:id => false

在create_table

选项下查看更多here
  

:ID

     

是否自动添加主键列。默认为true。连接has_and_belongs_to_many的表应该将其设置为false。

答案 3 :(得分:0)

如果您发布您的控制器我可以肯定,但rails默认为通过ID列查找记录。

主键与rails查找记录无关。

所以在你的控制器中有

Pucgrupo.find(params[:id])

它在表的id列中搜索该id ...您正在删除该id列。简单的解决方案是find_by

Pucgrupo.find_by_numero(params[:id])

这有效,但我强烈建议您考虑删除id列的原因,记住rails中的所有记录和关联依赖于该列的默认值。通过删除它你可以获得一个美丽的关联,并通过查找和外键引用使其变得丑陋。

id列是一件好事,如果你要删除它的唯一原因是你想用你的语言本地化表名...保持它...它会让你的生活更轻松