Ruby on rails ActionController::带删除操作的ParameterMissing
我对Rails还相当陌生,正在学习CodeAcademy等课程之外的第一个应用程序。我遇到了参数+构建删除函数的问题。当我将private tasks_params记录设置为如下所示时,我可以在索引上显示所有任务: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函数并确认它将抛出以下内容: 参数缺失或值为
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 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
正在生成的路由,它被命名为helper,您可以使用它创建链接,并告诉您链接helpers期望的参数以及控制器在使用该路由时将接收的参数routes.rb
- 读这本书。它很有价值。对于上面发布的代码,您有一个非常标准的CRUD(创建、读取、更新、销毁),因此rails脚手架非常适合您开始使用。在routes文件中,您只需声明
,而不是手动声明每个路由,它将为您创建所有的REOUTS(索引、显示、创建、更新、销毁)资源:任务
Rails非常庞大,需要很长时间才能掌握,但请相信我,我在过去6年中一直在使用Rails进行编码,它非常棒,值得每分钟投入,而且随着时间的推移,它会变得更加复杂:)感谢您提供的所有信息!巨大的帮助和脚手架的部分是可怕的。创建了一个新的Tasks_Controller.rb,并在params.fetch(:task)之后添加了我需要更新的参数,它成功了@RoryO'Connor关于rails脚手架的搜索是值得的。我建议
scaffold\u controller
,因为您已经有了一个模型,但是您可以一次性构建模型和控制器。就像笑话说的那样,你最终必须写一些代码(lol),但是脚手架是学习“Rails之路”的一个很好的方式,即使有5年以上的时间在生产巨大的monolith应用程序,我们仍然使用脚手架来启动新功能,它为我们提供了很好的服务。它还可以帮助你平静地思考。还值得指出一些可能让你困惑的事情:在你看来,指向助手的链接将使用方法::删除
,但它实际上(按照惯例)会将请求路由到控制器中的销毁
操作:)谢谢你的响应!这实际上可以解决眼前的问题,但总体问题更具结构性,需要更深入的解决。