我正在创建脚手架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">
答案 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列是一件好事,如果你要删除它的唯一原因是你想用你的语言本地化表名...保持它...它会让你的生活更轻松