Rails 5路由错误(缺少必需的密钥:[:id])

时间:2017-09-26 08:09:14

标签: ruby-on-rails ruby-on-rails-4

我收到以下错误:

No route matches {:action=>"search", :controller=>"items", :id=>nil}, missing required keys: [:id]

从这条路线:

resources :items do
    member do
      get :search
    end
end

这是我在视图中的形式:

<%= form_tag search_item_path, method: :get do %>
    <%= text_field_tag :term, params[:term], placeholder: 'Enter keyword' %>
    <%= submit_tag 'Search', name: nil  %>
<% end %>

2 个答案:

答案 0 :(得分:2)

使用search_item_path时没有id参数。

路径是在成员上定义的。在路由上下文中,成员将表示单个资源而不是资源集合。个人成员通常通过他们的id引用。因此,您的表单应如下所示:

<%= form_tag search_item_path([SOME ID YOU HAVE TO PROVIDE]), method: :get do %>
  <%= text_field_tag :term, params[:term], placeholder: 'Enter keyword' %>
  <%= submit_tag 'Search', name: nil  %>
<% end %>

OP评论后更新

我现在相信表格毕竟不是你的问题,而是路线。如果你想根据一些术语搜索项目,那么应该像这样设置路线:

resources :items do
  collection do
    get :search
  end
end

请注意,与问题中显示的路线相比,我将member更改为collection。然后,您应该可以使用您的表单,而不是问题中显示的内容(无需ID)。

您还可能希望重用已由资源定义设置的索引操作。过滤索引操作非常常见。

您可以look at the guide进一步参考。

答案 1 :(得分:1)

如果您有@item个对象,请使用:

<%= form_tag search_item_path(@item), method: :get do %>
    <%= text_field_tag :term, params[:term], placeholder: 'Enter keyword' %>
    <%= submit_tag 'Search', name: nil  %>
<% end %>

或:

<%= form_tag search_item_path(id: @item.id), method: :get do %>
  <%= text_field_tag :term, params[:term], placeholder: 'Enter keyword' %>
  <%= submit_tag 'Search', name: nil  %>
<% end %>

您似乎无法通过搜索查询。为什么在成员中包含搜索路径?

尝试把它拿出来:

resources :items
get '/items/search', to: "items#search"