在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>
点击“关键字搜索”后,我的问题似乎就出现了。链接。而不是运行vendors#keyword_search
并加载&#39; /views/vendors/keyword_search.html.erb &#39;模板,我的路径助手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'
非常感谢您的帮助,但最重要的是我真的想了解它为何运行show
而不是keyword_search
。
由于
答案 0 :(得分:1)
Rails按顺序处理路由。因此它将供应商/ keyword_search与供应商#show相匹配,因为这是路线中的第一个“匹配”。然后,它将keyword_search视为show route的:id参数。
因此,您应将关键字搜索的路线放在资源上方。
答案 1 :(得分:0)
在更改路线文件中的以下行后尝试
get 'vendors/keyword_search', to: 'vendors#keyword_search'
到
match "vendors/keyword_search" => "vendors#keyword_search", :as => :vendors_keyword_search_path