我有一种模式可以将我的控制器代码放在lib/
中以减少控制器的代码,我不知道这是否适用于我的实例变量。我需要将控制器的操作传递给lib/
,以便在操作中调用示例调用require
或include
,其中一些用于更多地组织我的代码。
行动是:
def calculate_ship
pacote = Correios::Frete::Pacote.new
@products = buy_cart.line_items
@products.each do |p|
p.product.length = 16 if !p.product.length
p.product.weight = 0.3 if !p.product.weight
p.product.width = 11 if !p.product.width
p.product.height = 6 if !p.product.height
@item = Correios::Frete::PacoteItem.new :peso => p.product.weight, :comprimento => p.product.length, :largura => p.product.width, :altura => p.product.height
while p.quantity > 0
pacote.add_item(@item)
p.quantity -= 1
end
end
frete = Correios::Frete::Calculador.new :cep_origem => "95520-000",
:cep_destino => params[:cep],
:encomenda => pacote
servicos = frete.calcular :sedex, :pac
@pac = servicos[:pac].valor
@sedex = servicos[:sedex].valor
flash[:error] = servicos[:sedex].msg_erro
end
如何将其移至lib/
?我不习惯用lib/
等认真编程。
答案 0 :(得分:1)
相反,如何将您的逻辑转移到模型和&私人方法。这样的事情?
<强>控制器强>
def calculate_ship
Model.products = buy_cart.line_items
Model.set_defaults
@products = Model.items
servicos = calc_costs
@pac = servicos[:pac].valor
@sedex = servicos[:sedex].valor
flash[:error] = servicos[:sedex].msg_erro
end
private
def calc_costs
frete = Correios::Frete::Calculador.new :cep_origem => "95520-000",
:cep_destino => params[:cep],
:encomenda => pacote
frete.calcular :sedex, :pac
end
<强>模型强>
attr_accessor :pacote, :products
def initialize
pacote = Correios::Frete::Pacote.new
end
def self.set_defaults
products.each do |p|
p.product.length = 16 if p.product.length.empty?
p.product.weight = 0.3 if p.product.weight.empty?
p.product.width = 11 if p.product.width.empty?
p.product.height = 6 if p.product.height.empty?
end
end
def self.items
products.each do |p|
@item = Correios::Frete::PacoteItem.new :peso => p.product.weight, :comprimento => p.product.length, :largura => p.product.width, :altura => p.product.height
while p.quantity > 0
pacote.add_item(@item)
p.quantity -= 1
end
end
end
PS:我没理解代码逻辑实际上在做什么,因为没有给出完整的代码。语言看起来像英语,但不是英语。所以,这是伪代码可能有一些错误,但我希望这将给你至少一个关于如何将代码从控制器移动到模型/私有方法的想法。控制器动作只应用于实例化实例变量&amp;调用对象上的方法。请记住,fat models & skinny controllers!。
希望有所帮助
<强> [编辑] 强> F.A.Q
Q1。控制器中的代码中的模型可以是某个模型吗?我这样说是因为这个动作在我的Cart控制器中,似乎模型不应该是产品?
答案:我不确定我完全理解你的意思the Model in you code in controller can be someone Model?
你是否在问这个型号代码应该做什么?它实际上很简单,如果这个模式代码与Cart
相关,则将其放入Cart的模型&amp;如果它是相关的Product
,则将其放入产品模型中。
Q2。这个attr_accessor:pacote,:在我的所有应用中,pacote的产品有效吗?和产品能够拿起产品型号产品?
Ans :attr_accessor :pacote, :productsis
声明getter / setters。请参阅What is attr_accessor in Ruby?