将Action放入Lib以减少行控制器并组织代码Rails

时间:2013-05-26 16:54:41

标签: ruby-on-rails ruby ruby-on-rails-3.2

我有一种模式可以将我的控制器代码放在lib/中以减少控制器的代码,我不知道这是否适用于我的实例变量。我需要将控制器的操作传递给lib/,以便在操作中调用示例调用requireinclude,其中一些用于更多地组织我的代码。

行动是:

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/等认真编程。

1 个答案:

答案 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?