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?' } %>