Rails资源路由未命中参数但匹配文档

时间:2016-03-16 18:06:16

标签: ruby-on-rails ruby

使用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
  • 我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:2)

更改

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

这样,如果您与其他模型进行联接,则不会在select中抱怨非特定id。如果您觉得输入太多,可以使用%i(...) syntax

Contact.select(*%i(title first last city phone email))

答案 1 :(得分:1)

您的代码似乎没问题。

也许你在@contacts数组中有一个未保存的实例,因此没有id?

另一种方法(同样,你的代码很好)将是:

= link_to&#39;显示&#39;,contact_path(联系人)

我建议发布路线文件。