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 method
med_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。
我正在尝试在我的 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 method
med_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。