我对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 class TasksController< ApplicationController的 def指数 @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>
提前致谢!
答案 0 :(得分:2)
很高兴您从头开始编写控制器,但我认为Rails是关于约定优于配置的,你应该接受它。
这意味着控制器的良好起点是检查脚手架控制器的外观,因为它们遵循Rails惯例(我不知道你是否知道这一点,但你可以让rails自动生成控制器代码你使用rails g scaffold_controller NameOfYourModel
)。
如果您查看生成的代码(根据您的具体情况,您将很容易理解),您会发现我们没有使用强参数:销毁行动(你按照惯例命名错误,应该是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
生成的路由,以及它可以用来创建链接的命名助手,还可以告诉您链接助手期望的参数以及控制器在接收时将获得的参数使用那条路线。
阅读Rails routing guide。它非常有价值。对于您上面发布的代码,您有一个非常标准的CRUD(创建,读取,更新,销毁),因此rails scaffold非常适合您入门。在您的路线文件中,您只需声明resource :tasks
,而不是手动声明每条路线,它将为您创建所有的重新路径(索引,显示,创建,更新,销毁)。
Rails是巨大的,需要很长时间才能掌握,但相信我,我在过去的6年中一直在编写它并且它非常棒,值得每一分钟投入其中,它随着时间的推移而复合:)
答案 1 :(得分:0)
罗里, 你的删除行动不应该是这样吗?
frmNewCustomer