gpt4 book ai didi

ruby-on-rails - 为什么这些删除操作不起作用?未定义方法 `destroy' 为 nil :NilClass Rails

转载 作者:数据小太阳 更新时间:2023-10-29 08:47:00 26 4
gpt4 key购买 nike

我正在尝试删除 Rails 中的一个对象,它是作业类的子对象。

%tbody
-if @job.job_delivery_costs.any?
-@job.job_delivery_costs.each do |delivery_cost|
%tr
%td
=delivery_cost.timing
%td
=delivery_cost.quantity
%td
=delivery_cost.cost_per_unit
%td
=delivery_cost.quantity * delivery_cost.cost_per_unit
%td
=link_to 'Delete', admin_job_job_delivery_cost_path(@job, delivery_cost), method: :delete, class: "btn btn-xs btn-danger"

路线.rb

resources :jobs do
member do
resources :job_delivery_costs
resources :extra_costs, only: [:create, :destroy]

Controller

before_action :get_job

def destroy
if @job && get_job_delivery_cost
@get_job_delivery_cost.destroy
flash[:success] = "Job delivery cost removed"
else
flash[:error] = "Couldn't find the record"
end
redirect_to admin_job_job_products_path(@job)
end

private

def get_job
@job = Job.find_by(id: params[:job_id])
end

def job_delivery_cost_params
params.require(:job_delivery_cost).permit!
end

def get_job_delivery_cost
@job_delivery_cost ||= JobDeliveryCost.where(id: params[:id]).first
end

end


rake routes

rep delivery_cost
job_delivery_costs_new GET /job_delivery_costs/new(.:format) job_delivery_costs#new
admin_delivery_costs GET /admin/delivery_costs(.:format) admin/delivery_costs#index
POST /admin/delivery_costs(.:format) admin/delivery_costs#create
new_admin_delivery_cost GET /admin/delivery_costs/new(.:format) admin/delivery_costs#new
edit_admin_delivery_cost GET /admin/delivery_costs/:id/edit(.:format) admin/delivery_costs#edit
admin_delivery_cost GET /admin/delivery_costs/:id(.:format) admin/delivery_costs#show
PATCH /admin/delivery_costs/:id(.:format) admin/delivery_costs#update
PUT /admin/delivery_costs/:id(.:format) admin/delivery_costs#update
DELETE /admin/delivery_costs/:id(.:format) admin/delivery_costs#destroy
admin_job_job_delivery_costs GET /admin/jobs/:job_id/job_delivery_costs(.:format) admin/job_delivery_costs#index
POST /admin/jobs/:job_id/job_delivery_costs(.:format) admin/job_delivery_costs#create
new_admin_job_job_delivery_cost GET /admin/jobs/:job_id/job_delivery_costs/new(.:format) admin/job_delivery_costs#new
edit_admin_job_job_delivery_cost GET /admin/jobs/:job_id/job_delivery_costs/:id/edit(.:format) admin/job_delivery_costs#edit
admin_job_job_delivery_cost GET /admin/jobs/:job_id/job_delivery_costs/:id(.:format) admin/job_delivery_costs#show
PATCH /admin/jobs/:job_id/job_delivery_costs/:id(.:format) admin/job_delivery_costs#update
PUT /admin/jobs/:job_id/job_delivery_costs/:id(.:format) admin/job_delivery_costs#update
DELETE /admin/jobs/:job_id/job_delivery_costs/:id(.:format) admin/job_delivery_costs#destroy

我肯定在这里传递了正确的参数。如果它要进入销毁条件,它必须找到对象,否则它只会渲染找不到对象。

但是我得到了这个错误

if @job 
@job_delivery_cost ||= JobDeliveryCost.where(id: params[:id]).first
@get_job_delivery_cost.destroy
flash[:success] = "Job delivery cost removed"
else
flash[:error] = "Couldn't find the record"
end
redirect_to admin_job_job_products_path(@job)

最佳答案

您在错误的对象上调用了 .destroy 方法,改为在 @job_delivery_cost 对象上调用它:

def destroy
if @job && get_job_delivery_cost
@job_delivery_cost.destroy
flash[:success] = "Job delivery cost removed"

我可以为您的代码提出一些建议吗?我认为它应该更一致一些,如下所示:

def destroy
set_job_delivery_cost # will set the variable `@job_delivery_cost`
if @job.present? && @job_delivery_cost.present?
@job_delivery_cost.destroy
flash[:success] = "Job delivery cost removed"
else
flash[:error] = "Couldn't find the record"
end
redirect_to admin_job_job_products_path(@job)
end

private

def set_job
@job = Job.find_by(id: params[:job_id])
end

def set_job_delivery_cost
@job_delivery_cost ||= JobDeliveryCost.find_by(id: params[:id])
end

def job_delivery_cost_params
params.require(:job_delivery_cost).permit!
end

如您所见,我将方法 get_jobget_job_delivery_cost 重命名为 set_jobset_job_delivery_cost。该方法本身表示它的执行会引发其变量的声明。

方法 get_job 将像这样实现,尊重它的名字:

def get_job
Job.find_by(id: params[:job_id])
end

Controller 中的用法是:

def destroy
@job = get_job
# etc.
end

关于ruby-on-rails - 为什么这些删除操作不起作用?未定义方法 `destroy' 为 nil :NilClass Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24826917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com