繁体   English   中英

带删除动作的ActionController :: ParameterMissing

[英]ActionController::ParameterMissing with Delete Action

我对Rails并不陌生,并且正在CodeAcademy之类的课程之外构建我的第一个应用程序。 我遇到参数+建立删除功能的问题。 当我使private task_params记录看起来像这样时,我可以在索引上显示所有任务:

    private 
    def task_params 
        params.require(:task).permit(:name, :description, :due_date)
    end

单击删除功能并确认将引发以下情况:

param is missing or the value is empty: task

当我不再“需要”:task参数,而是“允许”它时,如下所示:

private 
def task_params 
    params.permit(:task, :name, :description, :due_date)
end

我的应用返回:

Couldn't find Task with 'id'=

以下是route.rb文件,Tasks_Controller.rb文件和index.html.erb文件。 任何帮助都感激不尽。

的routes.rb

 get 'signup' => 'users#new'
  resources :users
  get 'login' => 'sessions#new'
  post 'login' => 'sessions#create'
  delete 'logout' => 'sessions#destroy'
  get 'tasks' => 'tasks#index'
  get 'tasks/new' => 'tasks#new'
  post 'tasks' => 'tasks#create'
  delete 'tasks/:id' => 'tasks#delete'
  get 'tasks/:id/edit' => 'tasks#edit' 
  put 'tasks/:id' => 'tasks#update'
end

Task_Controller.rb类TasksController <ApplicationController定义索引@task = Task.last(100)结束

def new
    @task = Task.new
end 

def create
    @task = Task.new(task_params) 
    if @task.save
        redirect_to '/tasks' 
    else 
        render 'new' 
    end 
end

def edit
    @task = Task.find(task_params[:id])
end

def update
    @task = Task.find(task_params[:id])
    @task.update_attributes(task_params[:description])

    redirect_to '/tasks'

end

def delete
    @task = Task.find(task_params[:id])
    @task.delete

    redirect_to tasks_path
end

private 
def task_params 
    params.permit(:task, :name, :description, :due_date)
end

结束

index.html.erb

<h2>Your Tasks</h2>
<div class="tasks">
    <div class="container">
        <% @task.each do |task| %> 
            <div class="task"> 
                <p>Title: <%= task.name %></p> 
                <p>Description: <%= task.description %></p>
                <p>Due Date: <%= task.due_date %></p>
                <%= link_to 'delete', task_path(task), 
                         method: :delete, 
                         data: { confirm: 'Are you sure?' } %>  
            </div>
        <% end %>
    </div>
</div>

提前致谢!

尝试从头开始编写控制器很高兴,但是我认为Rails完全是关于配置的约定,因此您应该接受这一点。

这意味着您的控制器的一个很好的起点是检查脚手架控制器的外观,因为它们遵循Rails约定(我不知道您是否知道,但是您可以让Rails通过使用rails g scaffold_controller NameOfYourModel自动为您生成控制器代码rails g scaffold_controller NameOfYourModel )。

如果查看生成的代码(根据您的实际情况,这将很容易理解),您会发现我们没有对:destroy动作使用强参数(您将其命名为错误的) ,按照惯例,应该使用def destroy而不是def delete )。

在该操作内,您将仅使用@task = Task.find(params[:id])查找模型,因此您无需在此处使用task_params

task_params的目标是在用于批量分配之前确保您拥有安全,经过消毒的参数(例如Task.create(task_params) ),但是在destroy动作中,我们不需要这样做,我们只需要查找记录即可并摧毁它。

一些额外的提示:

  • 打开http://localhost:3000/rails/info/routes ,从长远来看,它将为您带来很多帮助。 它将为您提供您的routes.rb生成的路由,它的名称为helper,可用于创建链接,还可以告诉您链接帮助程序期望哪些参数,以及使用该路由时控制器将接收哪些参数。

  • 阅读Rails布线指南 非常有价值。 对于上面发布的代码,您有一个非常标准的CRUD(创建,读取,更新,销毁),因此rails脚手架非常适合入门。 在您的路线文件中,您无需手动声明每个路线,而只是声明resource :tasks ,它将为您创建所有路线(索引,显示,创建,更新,销毁)。

Rails庞大,需要花很长时间才能掌握,但是请相信我,过去六年来我一直在编写代码,它很棒,值得在每一分钟上进行投资,而且随着时间的流逝它会变得复杂:)

罗里,您的删除动作不应该是这样吗?

def destroy
  @article = Task.find(params[:id])
  @article.destroy

  redirect_to tasks_path
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM