在 rails "get 'vendors/keyword_search', to: 'vendors#keyword_search'" 中运行“'vendors#show'”

In rails "get 'vendors/keyword_search', to: 'vendors#keyword_search'" runs "'vendors#show'"

在 rails 应用程序中,我正在尝试设置到关键字搜索页面的路径。我正在尝试通过以下测试:

scenario 'can perform a keyword search' do
  click_link 'Search'
  click_link 'Keyword search'
  expect(current_path).to eq '/vendors/keyword_search'
  fill_in 'search', with: vendor_one.email
  click_button 'Search suppliers'
  expect(page).to have_content vendor_one.email
  expect(page).not_to have_content vendor_two.email
end

到目前为止我有:

/views/vendors/index.html.erb

<div class='col-xs-3'>
  <p><%= link_to 'Keyword search', vendors_keyword_search_path %></p>
</div>

/routes.rb

root to: 'homepage#index'

resources :buyers, :vendors

get 'vendors/keyword_search', to: 'vendors#keyword_search'

/controllers/vendors_controller.rb

class VendorsController < ApplicationController
  def index
    @vendors = Vendor.all
  end

  def show
    @vendor = Vendor.find(params[:id])
  end

  def keyword_search
  end
end

然后我有一个 /views/vendors/keyword_search.html.erb 具有以下内容:

<div id='main container' class='container-fluid'>
  <div class='row'>
    <div class='col-xs-3'>
    </div>
    <div class='col-xs-6'>
      <h1>suppliers#keyword_search</h1>
    </div>
    <div class='col-xs-3'>
    </div>
  </div>
</div>

我的问题似乎是在点击 'Keyword search' link 之后出现的。而不是 运行ning vendors#keyword_search 并加载 '/views/vendors/keyword_search.html.erb' 模板,我的路径助手 vendors_keyword_search_path 尝试到 运行 vendors#show 导致以下错误消息(注意包括堆栈跟踪的第一行):

1) Buyers searching vendors can perform a keyword search
   Failure/Error: @vendor = Vendor.find(params[:id])

   ActiveRecord::RecordNotFound:
     Couldn't find Vendor with 'id'=keyword_search
   # ./app/controllers/vendors_controller.rb:7:in `show'

对此的帮助将不胜感激,但最重要的是我真的很想了解为什么它是 运行ning show 而不是 keyword_search.

谢谢

更改路由文件中的以下行后尝试

get 'vendors/keyword_search', to: 'vendors#keyword_search'

match "vendors/keyword_search" => "vendors#keyword_search", :as => :vendors_keyword_search_path

Rails 按顺序处理路由。因此它将 vendors/keyword_search 与 vendors#show 匹配,因为这是路由中的第一个 "match"。然后它将 keyword_search 视为显示路由的 :id 参数。

因此,您应该将 keyword_search 的路线放在资源上方。