您好我有以下代码:
def update_for_transport_document
# => DESCRIPTION:
# => Utilizzata nelle form di associazione di un warehouse ad una bolla
@wh_errors = Hash.new
if request.path.include? "ingress_transport_document"
session[:user_role] != "administrator" ?
@itd = IngressTransportDocument.filtered_by_registry(session[:registry_id]).find(params[:warehouse][:ingress_transport_document_id]) :
@itd = IngressTransportDocument.find(params[:warehouse][:ingress_transport_document_id])
@all_itd = IngressTransportDocument.all
logger.debug { "INGRESS_TRANSPORT_DOCUMENT_ID: #{@itd.id} " }
@warehouse = Warehouse.find(params[:warehouse][:id])
#check_warehouse_in_td(@all_itd,@warehouse)
@all_itd.each do |td|
td.warehouses.each do |whs|
logger.debug {"TD WAREHOUSES:#{whs.id} && #{@warehouse.id}"}
if whs.id == @warehouse.id
@ok = 'ciccia'
break
break
end
end
end
logger.debug {"OK:#{@ok} "}
if @ok != 'ciccia'
@itd.warehouses << @warehouse
else
logger.debug{"NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"}
end
respond_to do |format|
format.html { redirect_to(@itd) }
format.xml { head :ok }
end
else
session[:user_role] != "administrator" ?
@etd = EgressTransportDocument.filtered_by_registry(session[:registry_id]).find(params[:warehouse][:ingress_transport_document_id]) :
@etd = EgressTransportDocument.find(params[:warehouse][:ingress_transport_document_id])
logger.debug { "TEST" }
logger.debug { "EGRESS_TRANSPORT_DOCUMENT_ID: #{@etd.id}" }
@warehouse = Warehouse.find(params[:warehouse][:id])
logger.debug { "WAREHOUSE_ID: #{@warehouse.id}" }
@etd.warehouses << @warehouse
respond_to do |format|
format.html { redirect_to(@etd) }
format.xml { head :ok }
end
end
结束
我希望@warehouse
只有在其他@itd(@etd).warehouses
文档中没有相同的仓库时才能附加到ingress(egress)transport
。
我的问题是,如果仓库出现在另一个运输单据中,则任何仓库都可以附加到@itd(@etd).warehouses
任何仓库,如果它是一个与任何itd/etd
无关的新仓库。
哪里出错?
答案 0 :(得分:1)
在代码中找到错误真的很难。
我不会猜测哪一行会出错,相反我会给你一些提示:
Rails环境fat models - skinny controllers
中有一般规则。对于您的代码,它意味着:只留下脚手架生成的最小代码。所有业务逻辑都转移到模型中。您可能会问为什么:原因很少:您可以重用代码,对模型进行单元测试比控制器更容易。
我真的很鼓励你在你的模型中尝试构建逻辑单元测试。它比调试更有效。但是调试器仍然是强大的工具,我使用Rubymine的调试器。调试器使您可以在逐行应用程序执行中检查所有变量状态。
您的代码中有一件事:过度使用?
运算符
session[:user_role] != "administrator" ?
@itd = IngressTransportDocument.filtered_by_registry(session[:registry_id]).find(params[:warehouse][:ingress_transport_document_id]) :
@itd = IngressTransportDocument.find(params[:warehouse][:ingress_transport_document_id])
可读性低于:
if session[:user_role] != "administrator" then
@itd = IngressTransportDocument.filtered_by_registry(session[:registry_id]).find(params[:warehouse][:ingress_transport_document_id])
else
@itd = IngressTransportDocument.find(params[:warehouse][:ingress_transport_document_id])
end if