0

我有一种模式可以将我的控制器代码放入lib/以减少控制器的代码,我不知道这是否适用于我的实例变量。我需要一些将控制器的操作传递给 a 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/等来认真地编程。

4

1 回答 1

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:我不理解代码逻辑,因为没有给出完整的代码,而且语言看起来像英语,但不是英语。所以,这是伪代码可能有一些错误,但我希望这能让您至少了解如何将代码从控制器移动到模型/私有方法中。控制器动作只能用于实例化实例变量和调用对象的方法。请记住,胖模型和瘦控制器!.

希望能帮助到你

[编辑] 常见问题

Q1。控制器中代码中的模型可以是某人模型吗?我这么说是因为这个动作在我的购物车控制器中,似乎模型不应该是产品?

Ans:我不确定我是否完全理解你的意思the Model in you code in controller can be someone Model?你问这个模型代码应该在哪里做?其实很简单,如果这个模式代码是相关的Cart,把它放在Cart的模型中,如果它是相关的Product,把它放在产品的模型中。

Q2。这个 attr_accessor :pacote, :productsis 的 pacote 在我所有的应用程序中都有效吗?和产品能接产品型号产品吗?

Ans :attr_accessor :pacote, :productsis声明 getter/setter。请参阅Ruby 中的 attr_accessor 是什么?

于 2013-05-26T18:29:41.843 回答