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 一起使用的。

为什么 ID 没有传递给 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]

在Rails4的路由资源中更改parent:parent_id参数的名称

如何避免Rails 5嵌套资源命名空间路由中的双下划线

资源模型名称与路径或控制器不匹配时如何编写路由

Rails 3 路由如何匹配多个?

Rails:手工生成的路由与使用资源创建的路由具有不同的前缀