Ruby on rails rails 3,未定义的方法'eq';零级:零级

Ruby on rails rails 3,未定义的方法'eq';零级:零级,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我是格鲁波 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 :clas

我是格鲁波

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
尝试创建组后,出现以下错误:

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编辑

我正在编辑迁移主键编号:

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
错误显示页面为:

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 Methodos show

  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>
ActionController::Pucgrupos索引中的路由错误
显示/home/andres/desarrolos/rubyonrails/proyecto/app/views/pucgrupos/index.html.erb,其中第18行出现:
没有路由匹配{:controller=>“pucgrupos”,:action=>“show”,:id=>#}
提取的源(第18行附近):
15:     
16:     
17:     
18:     
19:     
20:“你确定吗?”,:method=>:delete%>
21:   
我正在进入rails控制台并键入

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">
Pucgrupo.按数字查找(1)
=> #

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

:id => false
有关详细信息,请参见“创建表格的选项”下的

:id

是否自动添加主键列。默认为true。has_和_belish_to_的联接表很多人应该将其设置为false


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

Pucgrupo.find(params[:id])
在操作中,控制器#显示给


如果发布控制器,我可以肯定,但是rails默认按ID列查找记录

主键与rails查找记录无关

所以当你有

Pucgrupo.find(params[:id])
它正在表的id列中搜索该id。。。您正在删除该id列。最简单的解决方法是通过

Pucgrupo.find_by_numero(params[:id])
这是可行的,但我强烈建议您考虑一下为什么要删除id列,记住rails中的所有记录和关联都依赖于该列作为默认值。通过删除它,您可以获得一个美丽的关联,并使用findby的和外键引用使它变得丑陋


id列是一件好事,如果删除它的唯一原因是希望用语言本地化表名。。。留着吧。。。这将使您的生活更轻松

最后一个错误是您在未通知rails的情况下替换了默认主键

当助手尝试为show操作生成URL时,视图中的第18行会生成错误。尝试添加这一行

primary_key :numero
给你的模特班。我想通过这种方式,您可以使用find调用来解决问题

顺便说一句,正如有人指出的,更改默认主键名通常是一个坏主意,这会导致此类问题

编辑 要回答您的评论,是的,遵循框架约定总是更好的,RoR基于约定优于配置范式,因此您应该真正遵循这些约定,除非您有认真的理由更改它们(例如,使用现有数据的遗留数据库)。也就是说,即使你改变了一些惯例,你也必须知道这样做的所有后果,而且你只有通过经验才能获得这些知识

在本例中,主键用于find方法、URL生成、外键查找等。此外,一些第三方gem可能依赖于id字段,并可能停止工作


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

数据库中是否有任何数据?是的,数据插入到表中确定,但我不想添加主键id,我想创建主键numero:class CreatePucgruposfalse,:primary_key=>:numero do | t | t.integer:numero t.integer:clase_id t.string:nombre t.timestamps end def self.down下拉_table:pucgrupos end endo ok。尝试在迁移文件中使用:primary\u key=>numero,而不是:id=>false。好的,我是remove id列,因为de-foreign\u key是表grupo中的numero。我认为这样更好。抱歉mi english.humm好的,那么最好保留默认值是主键ID?这很完美,您的回答让我对rails有了更好的理解。谢谢,但是,手动输入ID号的ID字段也是如此?@andres我还不明白您的最后一个问题,您能解释得更好吗?
Pucgrupo.find(params[:id])
Pucgrupo.find_by_numero(params[:id])
primary_key :numero