form_tag 未定义的局部变量或方法

undefined local variable or method with form_tag

我正在尝试在我的 Rails 应用程序中创建一个简单的搜索表单。我的 url 路径错误,格式为:

<%= form_tag(med_search, :method => "get", id: "search-form") do %>
            <%= text_field_tag :search, params[:search], placeholder: "Search", class: "form-control" %>
            <%= button_to "Search", class: "btn btn-default" %>
          <% end %>

上面的第一行导致错误 undefined local variable or methodmed_search' for #<#:0x007fab2b5afa90>`

问题很可能与我的路线设置有关。我创建了一个名为搜索的新控制器操作,因此我将 routes.db 编辑为如下所示:

resources :meds do
  collection do
    get 'search' => 'meds#search'
  end
end
  devise_for :users
  #get 'meds/index'
  root to: "meds#index"
  resources :meds, :path => ''
end

当我进行 rake 路由时,我看到路径 med 搜索所以我知道 url 是有效的:

                  Prefix Verb   URI Pattern                    Controller#Action
              med_search GET    /meds/:med_id/search(.:format) meds#search
                    meds GET    /meds(.:format)                meds#index
                         POST   /meds(.:format)                meds#create
                 new_med GET    /meds/new(.:format)            meds#new
                edit_med GET    /meds/:id/edit(.:format)       meds#edit
                     med GET    /meds/:id(.:format)            meds#show
                         PATCH  /meds/:id(.:format)            meds#update
                         PUT    /meds/:id(.:format)            meds#update
                         DELETE /meds/:id(.:format)            meds#destroy
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
                    root GET    /                              meds#index
                         GET    /                              meds#index
                         POST   /                              meds#create
                         GET    /new(.:format)                 meds#new
                         GET    /:id/edit(.:format)            meds#edit
                         GET    /:id(.:format)                 meds#show
                         PATCH  /:id(.:format)                 meds#update
                         PUT    /:id(.:format)                 meds#update
                         DELETE /:id(.:format)                 meds#destroy

我应该在路由中更改什么来解决这个问题?

谢谢!

编辑:将 url 更改为 med_search_path,出现新错误:No route matches {:action=>"search", :controller=>"meds"} missing required keys: [:med_id]。好像跟路线有关 /meds/:med_id/search(.:format)

1) 你需要像这样改变你的 form_tag

 <%= form_tag(search_meds_path, :method => "get", id: "search-form") do %>

2) 您需要将路线从 member 更改为这样的集合

resources :meds do
  collection do
    get 'search' => 'meds#search'
  end
end

3) 不知道为什么要在底部再次添加 resources :meds, :path => ''。如果不需要,最好去掉。

看起来您正在尝试编写搜索代码,但因为您将其放在资源块中 Rails 假设您正在谈论特定的 med

从资源块中删除路线并将其更改为get 'meds/search' => 'meds#search'。这将允许您将它用作常规端点,而不会 Rails 抱怨您需要 ID。