【问题标题】:ActionController::ParameterMissing with Delete Action带有删除操作的 ActionController::ParameterMissing
【发布时间】:2018-08-13 19:26:23
【问题描述】:

我对 Rails 还很陌生,并且在 CodeAcademy 之类的课程之外构建我的第一个应用程序。我遇到了参数+构建删除功能的问题。当我使私有 tasks_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'=

下面是 routes.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 类任务控制器

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>

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

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

    如果您查看生成的代码(考虑到您的获取方式,您将很容易理解),您会发现我们没有为 :destroy 操作使用强参数(您是命名错误,按照惯例应该是def destroy 而不是def delete)。

    在该操作中,您只需找到带有 @task = Task.find(params[:id]) 的模型,因此您不会在此处使用 task_params

    task_params 的目标是在将其用于批量分配之前确保您拥有一个安全、经过消毒的参数(如在Task.create(task_params) 中),但在销毁操作中我们不需要它,我们只需要找到记录并销毁它。

    一些额外的提示:

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

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

    Rails 非常庞大,需要很长时间才能掌握,但请相信我,过去 6 年来我一直在编写它,它非常棒,每一分钟都值得投入,而且随着时间的推移,它会变得更加复杂: )

    【讨论】:

    • 感谢您提供所有这些信息!巨大的帮助,脚手架部分很棒。创建了一个新的 Tasks_Controller.rb 并添加了我需要在 params.fetch(:task) 之后更新的参数,它工作了!
    • @RoryO'Connor 值得搜索有关 rails 脚手架的信息。我建议scaffold_controller 因为你已经有一个模型,但是你可以一次性搭建模型和控制器。就像笑话所说的那样,你最终必须编写一些代码(哈哈),但是脚手架是学习“Rails 方式”的好方法,即使有 5 年以上的大型单体应用程序生产,我们仍然使用脚手架作为开始新功能,它很好地为我们服务。它还可以帮助您以 REST 的方式思考。
    • 还值得指出一些可能让您感到困惑的事情:在您看来,link_to 助手将使用method: :delete,但它实际上(按照惯例)将请求路由到destroy 操作在你的控制器中:)
    【解决方案2】:

    罗里, 你的删除操作不应该是这样的吗?

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

    【讨论】:

    • 感谢您的回复!这实际上可以解决眼前的问题,但整体问题更具结构性,需要更深入的解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多