在rails" get' vendors / keyword_search',to:'供应商#keyword_search'"运行"'供应商#show'"

时间:2016-11-21 15:54:04

标签: ruby-on-rails ruby controller routes helper

在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

由于

2 个答案:

答案 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