Rails 资源路由缺少参数但匹配文档
Posted
技术标签:
【中文标题】Rails 资源路由缺少参数但匹配文档【英文标题】:Rails resources routes miss parameters yet match documentation 【发布时间】:2016-07-02 19:12:58 【问题描述】:使用 Rails 的 resources
指令,我为控制器 (contacts
) 创建了一组路由。我现在正在编辑它们附带的默认视图,以包含我自己的一些内容。但是,link_to
方法失败了,告诉我缺少一个必需的参数。
没有路由匹配
:action => 'show', :controller => 'contacts', :id => nil
缺少必需的键[:id]
很明显为什么会发生这种情况 - link_to
方法没有提供 ID,而是得到了 nil。但是,我使用的代码与 link_to
的文档相匹配。
这是有问题的视图:
<% @contacts.each do |contact| %>
<tr>
<td><%= contact.first %></td>
<td><%= contact.last %></td>
<td><%= contact.title %></td>
<td><%= contact.city %></td>
<td><%= contact.phone %></td>
<td><%= contact.email %></td>
<td><%= link_to 'Show', contact %></td>
<td><%= link_to 'Edit', edit_contact_path(contact) %></td>
<td><%= link_to 'Delete', contact.id, method: :delete, data: confirm: 'Are you sure?' %></td>
</tr>
<% end %>
@contacts
是从控制器返回的一组联系人。设置的行是:
@contacts = Contact.select("title, first, last, city, phone, email")
.where("created_by" => @current_user.id)
routes.rb文件的相关内容就是resources :contacts
。
documentation 声明:
因为它依赖于 url_for,所以 link_to 支持旧式控制器/动作/id 参数和更新的 RESTful 路由。当前的 Rails 风格尽可能支持 RESTful 路由,因此将您的应用程序基于资源并使用 [...]
link_to "Profile", @profile
这似乎是我与link_to 'Show', contact
一起使用的。
link_to
?
我能做些什么来解决这个问题?
【问题讨论】:
你确定联系人的id值是填的吗?要回答,我们需要知道 @contacts 中有什么?也许有一个选择子句阻止访问联系人属性? @Oxynum 已编辑,我认为您现在可能正在我查看它。 【参考方案1】:改变
Contact.select("title, first, last, city, phone, email")
到
Contact.select("title, first, last, city, phone, email, id")
联系人的 id 为 nil,因为它不在选择查询中。
另外,虽然它现在似乎没有引起问题,但我建议使用符号数组而不是逗号分隔的字符串,以便 sql 查询更具体。例如:
Contact.select("title, first").to_sql #=> SELECT title, first FROM contacts
Contact.select(:title,:first).to_sql #=> SELECT "contacts"."title", "contacts"."first" FROM contacts
这样,如果您与另一个模型进行连接,它就不会抱怨选择中的不特定 id
。如果你觉得打字太多,可以使用%i(...) syntax:
Contact.select(*%i(title first last city phone email))
【讨论】:
【参考方案2】:您的代码看起来不错。
也许您在 @contacts 数组中有一个未保存的实例,因此没有 id?
另一种表达方式(同样,您的代码很好)是:
= link_to '显示', contact_path(contact)
我建议发布路线文件。
【讨论】:
Routes 文件已编辑,但唯一相关的部分是resources :contacts
以上是关于Rails 资源路由缺少参数但匹配文档的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4 RoutingError:没有路由匹配 [POST]