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 CreatePucgrupos
Pucgrupo.find(params[:id])
Pucgrupo.find_by_numero(params[:id])
primary_key :numero