Has_many通过关联模型未找到/传递了错误的参数

时间:2018-07-25 11:14:15

标签: ruby-on-rails activerecord ruby-on-rails-5

我有3个模型。一种是财产模型,它具有两个相关的模型:租户和发票:

class Property < ApplicationRecord
 belongs_to :user
 has_many :tenants, dependent: :destroy
 has_many :invoices, dependent: :destroy
end

class Tenant < ApplicationRecord
 belongs_to :property
 has_many :invoices, through: :properties
end

class Invoice < ApplicationRecord
 belongs_to :property
 has_many :tenants, through: :properties
end

当我尝试删除发票时,它会显示以下消息:

ActiveRecord :: RecordNotFound在TenantsController#destroy中 找不到'id'= 3 [WHERE“ tenants”。“ property_id” = $ 1]的租户

我了解到,当我尝试销毁发票时,它会尝试删除关联的承租人,并在参数中传递ID = 3,这是发票的ID。

这是我的控制器:

class InvoicesController < ApplicationController
 before_action :authenticate_user!


 def destroy
  @property = Property.find(params[:property_id])
  @invoice = @property.invoices.find(params[:id])
  @invoice.destroy
  flash[:alert] = "Locataire supprimé."
  redirect_to user_property_invoices_path
 end
end

class TenantsController < ApplicationController
 before_action :authenticate_user!

 def destroy
  @property = Property.find(params[:property_id])
  @tenant = @property.tenants.find(params[:id])
  @tenant.destroy
  flash[:alert] = "Locataire supprimé."
  redirect_to user_properties_path
 end
end

当然,参数Id = 3是错误的。如何避免所有关联的租户模型一起被发票删除?

真的非常感谢!

1 个答案:

答案 0 :(得分:0)

  

我了解到,当我尝试销毁发票时,它会尝试删除关联的承租人,并在参数中传递ID = 3,这是发票的ID。

否,即使您指定了dependent: :destroyRails也会通过数据库删除它,而不是向删除的关联记录发送Http请求。

  

当我尝试删除发票时,它会显示以下消息:

     

TenantsController#destroy中的ActiveRecord :: RecordNotFound找不到'id'= 3 [WHERE“ tenants”。“ property_id” = $ 1]的租户

您正试图删除发票,但错误消息显示正在调用TenantsController#destroy

我认为,您使用了错误的网址帮助程序,例如user_properties_tenant_path(@invoice.id)而不是user_properties_invoice_path(@invoice.id),因此调用了TenantsController而不是InvoicesController