Ruby on rails Rails资源路由未命中参数,但与文档匹配

Ruby on rails Rails资源路由未命中参数,但与文档匹配,ruby-on-rails,ruby,Ruby On Rails,Ruby,使用Rails的资源指令,我为控制器(联系人)创建了一组路由。我现在正在编辑它们附带的默认视图,以包含一些我自己的内容。但是,link\u to方法失败,告诉我缺少一个必需的参数 没有路由匹配{:action=>'show',:controller=>'contacts',:id=>nil}缺少必需的密钥[:id] 发生这种情况的原因很明显,link\u to方法没有提供ID,而是得到了零。但是,我使用的代码与link\u to的文档相匹配 这是有争议的观点: <% @contacts.e

使用Rails的
资源
指令,我为控制器(
联系人
)创建了一组路由。我现在正在编辑它们附带的默认视图,以包含一些我自己的内容。但是,
link\u to
方法失败,告诉我缺少一个必需的参数

没有路由匹配
{:action=>'show',:controller=>'contacts',:id=>nil}
缺少必需的密钥
[:id]

发生这种情况的原因很明显,
link\u to
方法没有提供ID,而是得到了零。但是,我使用的代码与
link\u 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 %>
  • routes.rb文件的相关内容只是
    resources:contacts

  • 各国:

    因为它依赖于url_,所以link_既支持旧样式的控制器/操作/id参数,也支持新的RESTful路由。当前的Rails风格尽可能支持RESTful路由,因此应用程序基于资源并使用[…]

    link_to "Profile", @profile
    
    这似乎就是我正在使用的
    链接到“Show”,联系

    • 为什么ID没有传递到
      链接到
    • 我能做些什么来补救这个问题
      • 您的代码似乎很好

        也许@contacts数组中有一个实例没有保存,因此没有id

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

        =链接到“显示”,联系人路径(联系人)

        我建议张贴路线文件

        变化

        Contact.select("title, first, last, city, phone, email")
        

        联系人的id为nil,因为它不在select查询中

        另外,虽然现在看起来没有引起问题,但我还是建议使用符号数组而不是逗号分隔的字符串进行查询,这样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
        。如果您觉得键入的内容太多,可以使用:


        您确定联系人的id值已填写吗?要回答这个问题,我们需要知道@contacts中有什么?可能有一个select子句阻止访问中编辑的联系人属性?@Oxynum,我想您现在可能看到了它。路由中编辑的文件,尽管唯一相关的部分是
        resources:contacts
        Contact.select("title, first, last, city, phone, email, id")
        
        Contact.select("title, first").to_sql #=> SELECT title, first FROM contacts
        Contact.select(:title,:first).to_sql #=> SELECT "contacts"."title", "contacts"."first" FROM contacts
        
        Contact.select(*%i(title first last city phone email))