Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActionController::带删除操作的ParameterMissing_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails ActionController::带删除操作的ParameterMissing

Ruby on rails ActionController::带删除操作的ParameterMissing,ruby-on-rails,ruby,Ruby On Rails,Ruby,我对Rails还相当陌生,正在学习CodeAcademy等课程之外的第一个应用程序。我遇到了参数+构建删除函数的问题。当我将private tasks_params记录设置为如下所示时,我可以在索引上显示所有任务: private def task_params params.require(:task).permit(:name, :description, :due_date) end 单击delete函数并确认它将抛出以下内容: 参数缺失或值为

我对Rails还相当陌生,正在学习CodeAcademy等课程之外的第一个应用程序。我遇到了参数+构建删除函数的问题。当我将private tasks_params记录设置为如下所示时,我可以在索引上显示所有任务:

    private 
    def task_params 
        params.require(:task).permit(:name, :description, :due_date)
    end
单击delete函数并确认它将抛出以下内容:

参数缺失或值为空:任务

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

private 
def task_params 
    params.permit(:task, :name, :description, :due_date)
end
我的应用程序返回:

找不到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
<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>
任务\u控制器.rb 类TasksController 结束

index.html.erb

 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
<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>
您的任务
标题:

说明:

截止日期:

提前谢谢

Rory, 您的删除操作不应该是这样的吗

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

  redirect_to tasks_path
end

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

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

如果您查看生成的代码(考虑到如何获得,您将很容易理解),您将看到:destroy操作没有使用强参数(您将其命名错误,按照惯例,它应该是
def destroy
,而不是
def delete

在该操作中,您只需找到带有
@task=task.find(params[:id])
的模型,因此您不需要在那里使用
task\u params

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

一些额外提示:

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

  • 读这本书。它很有价值。对于上面发布的代码,您有一个非常标准的CRUD(创建、读取、更新、销毁),因此rails脚手架非常适合您开始使用。在routes文件中,您只需声明
    资源:任务
    ,而不是手动声明每个路由,它将为您创建所有的REOUTS(索引、显示、创建、更新、销毁)


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

感谢您提供的所有信息!巨大的帮助和脚手架的部分是可怕的。创建了一个新的Tasks_Controller.rb,并在params.fetch(:task)之后添加了我需要更新的参数,它成功了@RoryO'Connor关于rails脚手架的搜索是值得的。我建议
scaffold\u controller
,因为您已经有了一个模型,但是您可以一次性构建模型和控制器。就像笑话说的那样,你最终必须写一些代码(lol),但是脚手架是学习“Rails之路”的一个很好的方式,即使有5年以上的时间在生产巨大的monolith应用程序,我们仍然使用脚手架来启动新功能,它为我们提供了很好的服务。它还可以帮助你平静地思考。还值得指出一些可能让你困惑的事情:在你看来,指向助手的
链接将使用
方法::删除
,但它实际上(按照惯例)会将请求路由到控制器中的
销毁
操作:)谢谢你的响应!这实际上可以解决眼前的问题,但总体问题更具结构性,需要更深入的解决。