ActionController ::带有删除操作的ParameterMissing

问题描述 投票:1回答:2

我是Rails的新手,并且在CodeAcademy等课程之外构建我的第一个应用程序。我遇到了参数+构建删除函数的问题。当我将private tasks_params记录看起来像这样时,我可以在索引上显示所有任务:

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

单击删除功能并确认它会抛出:

param is missing or the value is empty: 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类TasksController <ApplicationController def index @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>

提前致谢!

ruby-on-rails ruby
2个回答
2
投票

你试图从头开始编写控制器很好,但我认为Rails是关于约定优于配置的,你应该接受它。

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

如果你看一下生成的代码(你很容易理解你已经得到了什么),你会看到我们不使用强参数:destroy动作(你命名错了,按照惯例,它应该是def destroy而不是def delete)。

在这个动作中,你只需找到@task = Task.find(params[:id])的模型,所以你不要在那里使用task_params

task_params的目标是确保你在使用它进行质量分配之前有一个安全的,消毒的params(比如Task.create(task_params)),但是在我们不需要的破坏行动中,我们只需找到记录并将其销毁。

一些额外的提示:

  • 打开http://localhost:3000/rails/info/routes,从长远来看,它会帮助你很多。它将为您提供routes.rb生成的路径,并命名为helper,您可以使用它来创建链接,并告诉您链接助手期望的参数以及控制器在使用该路径时将收到的参数。
  • 阅读Rails routing guide。这非常有价值。对于您上面发布的代码,您有一个非常标准的CRUD(创建,读取,更新,销毁),因此rails scaffold非常适合您入门。在您的路线文件中,您只需声明resource :tasks,而不是手动声明每条路线,它将为​​您创建所有的重新路径(索引,显示,创建,更新,销毁)。

Rails是巨大的,需要很长时间才能掌握,但是相信我,我在过去的6年里一直在编写它并且它很棒,值得每一分钟投入它,它随着时间的推移而复合:)


0
投票

罗里,你的删除行动不应该是这样吗?

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

  redirect_to tasks_path
end
© www.soinside.com 2019 - 2024. All rights reserved.