ActionController::ParameterMissing 在 TagsController#create
ActionController::ParameterMissing in TagsController#create
我正在尝试从索引页触发销毁操作,以获取附加到多个记录的标签。但是,当触发操作时,我在创建操作中收到上述错误。调用创建操作时不会发生错误。我的代码如下所示。
标签控制器
class TagsController < ApplicationController
before_action :require_user, only: [:edit, :update, :destroy]
before_action :set_search
def new
@tag = Tag.new
end
def create
tag = Tag.create(tag_params)
if tag.save
redirect_to tags_path
else
redirect_to sign_up_path
end
end
def destroy
@tag = Tag.find(params[:tag_id])
@tag.destroy
redirect_to tags_path
end
private
def tag_params
params.require(:tag).permit(:name)
end
end
路线
Rails.application.routes.draw do
# For details on the DSL available within this file, see
http://guides.rubyonrails.org/routing.html
resources :recipes do
resources :ingredients, :steps
put :favorite, on: :member
end
resources :users
get 'recipes' => 'recipes#index'
get 'recipes/:id' => 'recipes#show'
get 'signup' => 'users#new'
get 'tags' => 'tags#index'
get 'new_tags' => 'tags#new'
post 'tags' => 'tags#create'
delete 'tags' => 'tags#destroy'
get 'login' => 'sessions#new'
post 'login' => 'sessions#create'
delete 'logout' => 'sessions#destroy'
root 'recipes#index'
end
索引
<%= link_to 'New Tag', new_tags_path(@tag) %>
<% Tag.find_each do |tag| %>
<%= tag.name %>
<%= link_to 'Delete Tag', @tag,
method: :destroy,
data: { confirm: 'Are you sure?' } %>
<% end %>
这条路线:
delete 'tags' => 'tags#destroy'
表示没有 id 参数的“/tags”。
你必须告诉路由器你想要 url 的一部分用作 :tag_id
delete 'tags/:tag_id' => 'tags#destroy'
无论如何,我建议您坚持 rails 约定,只使用
resources :tags
在控制器上
@tag = Tag.find(params[:id])
我不确定你为什么要手动设置路线,如果你是 Rails 的新手,请阅读此 link:https://guides.rubyonrails.org/routing.html
你甚至有这样的台词
get 'recipes' => 'recipes#index'
get 'recipes/:id' => 'recipes#show'
这是不必要的,因为 resources :recipes
已经创建了它们。
该错误源于视图中 Link To 语句中的一系列问题。 Link 应该写在下面...
<%= link_to 'Delete Tag', tag_path(tag),
method: :delete,
data: { confirm: 'Are you sure?' } %>
我正在尝试从索引页触发销毁操作,以获取附加到多个记录的标签。但是,当触发操作时,我在创建操作中收到上述错误。调用创建操作时不会发生错误。我的代码如下所示。
标签控制器
class TagsController < ApplicationController
before_action :require_user, only: [:edit, :update, :destroy]
before_action :set_search
def new
@tag = Tag.new
end
def create
tag = Tag.create(tag_params)
if tag.save
redirect_to tags_path
else
redirect_to sign_up_path
end
end
def destroy
@tag = Tag.find(params[:tag_id])
@tag.destroy
redirect_to tags_path
end
private
def tag_params
params.require(:tag).permit(:name)
end
end
路线
Rails.application.routes.draw do
# For details on the DSL available within this file, see
http://guides.rubyonrails.org/routing.html
resources :recipes do
resources :ingredients, :steps
put :favorite, on: :member
end
resources :users
get 'recipes' => 'recipes#index'
get 'recipes/:id' => 'recipes#show'
get 'signup' => 'users#new'
get 'tags' => 'tags#index'
get 'new_tags' => 'tags#new'
post 'tags' => 'tags#create'
delete 'tags' => 'tags#destroy'
get 'login' => 'sessions#new'
post 'login' => 'sessions#create'
delete 'logout' => 'sessions#destroy'
root 'recipes#index'
end
索引
<%= link_to 'New Tag', new_tags_path(@tag) %>
<% Tag.find_each do |tag| %>
<%= tag.name %>
<%= link_to 'Delete Tag', @tag,
method: :destroy,
data: { confirm: 'Are you sure?' } %>
<% end %>
这条路线:
delete 'tags' => 'tags#destroy'
表示没有 id 参数的“/tags”。
你必须告诉路由器你想要 url 的一部分用作 :tag_id
delete 'tags/:tag_id' => 'tags#destroy'
无论如何,我建议您坚持 rails 约定,只使用
resources :tags
在控制器上
@tag = Tag.find(params[:id])
我不确定你为什么要手动设置路线,如果你是 Rails 的新手,请阅读此 link:https://guides.rubyonrails.org/routing.html
你甚至有这样的台词
get 'recipes' => 'recipes#index'
get 'recipes/:id' => 'recipes#show'
这是不必要的,因为 resources :recipes
已经创建了它们。
该错误源于视图中 Link To 语句中的一系列问题。 Link 应该写在下面...
<%= link_to 'Delete Tag', tag_path(tag),
method: :delete,
data: { confirm: 'Are you sure?' } %>