【问题标题】:Rails resources routes miss parameters yet match documentationRails 资源路由缺少参数但匹配文档
【发布时间】: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 已编辑,我认为您现在可能正在我查看它。

标签: ruby-on-rails ruby


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    相关资源
    最近更新 更多