我在一个已经存在的表格中遇到了各种各样的问题,我生成了脚手架。这些症状似乎都与身份缺失或被误解有关。
我的表格如下:
Table "public.notes"
Column | Type | Modifiers | Storage | Description
-----------------+---------+-----------+----------+-------------
id | integer | | plain |
data | text | | extended |
我像这样生成了脚手架:
script/generate scaffold notes id:integer data:string --skip-migration
我看到的第一个问题出现了尝试访问/ notes路径中的任何路径。只要有指向特定注释的链接,路径就会无法生成。例如,“显示”链接的定义通常如下:
<%= link_to 'Show', note %>
几乎所有这样的路线都应该工作失败,错误看起来像这样:
edit_note_url failed to generate from {:action=>"edit", :controller=>"notes", :id=>#<Note id: 13, data: "This is a test note.">}, expected: {:action=>"edit", :controller=>"notes"}, diff: {:id=>#<Note id: 13, data: "This is a test note.">}
由于这不能按预期工作,但我修改了这样的链接,事情再次顺利进行:
<%= link_to 'Show', :action => :show, :id => note[:id].to_s %>
我现在遇到的问题(这让我意识到更深层次的东西在这里是错误的并且解决问题不是答案)是试图编辑一个笔记导致没有变化。检查日志显示以下内容:
Parameters: {"data"=>"This is a test note being modified.", "commit"=>"Update", "authenticity_token"=>"+ue4O6EimVNyZVHdgChy+/0w07vc5HuxFc/IQZX+rpA=", "id"=>"13"}
Note Load (0.5ms) SELECT * FROM "notes" WHERE ("notes"."id" = 13)
SQL (0.2ms) BEGIN
Note Update (0.3ms) UPDATE "notes" SET "data" = E'This is a test note being modified.' WHERE "id" = NULL
SQL (0.2ms) COMMIT
所以,我在这里做错了。有人可以帮助我,并指出我没有遵循的任何惯例?
答案 0 :(得分:0)
通常,您使用其关联的资源路径链接到资源,并使用Rails 2.3表示法在config/routes.rb
中定义:
map.resources :notes
这将生成一些在rake routes
的输出中可见的路线,但您正在寻找的路线是:
<%= link_to('Show', note_path(note)) %>
为了验证您的Note模型是否正常工作,您应该进行一些简单的单元测试,以便从测试数据库中创建,更新和读取注释,以确保您没有在无意中做错。
在那里发生了一些可疑的事情,因为在UPDATE
声明中id
属性已经结束nil
,这意味着无法正确应用。你的模型中有什么不寻常的东西吗?
请注意,在通过URL或note.id
调用链接时,不应直接使用_path
,因为这可能与对象的处理方式不同。事情通常是覆盖他们的to_param
方法来定制这种行为,然后一边踩它就好了。作为一般规则,仅在SQL的上下文中使用note.id
,如果需要,则使用note.to_param
以用于URL。通常,URL生成器会为您处理此问题。