轨道4上的个人类方法的未定义方法

时间:2017-09-06 02:43:04

标签: ruby-on-rails ruby ruby-on-rails-4

我有以下个人课程来处理购物车的安排,但是当我尝试在我的控制器中调用此类的方法时,它表示未定义的方法add_cesta

这是我的班级

class Carro
  attr_reader :cesta

  def initialize
    @cesta = []
  end

  def add_cesta(articulo)
    @cesta << articulo
  end

end

这是我的控制器

class TiendaController < ApplicationController


  def index
    @titulo = "Bienvenido a la Tienda"
    @articulos = Articulo.all.order("nombre").page(params[:page]).per_page(4)    
  end

  def quienes_somos
    @titulo = "Bienvenido a la Tienda"      
  end

  def contacto
    @titulo = "Bienvenido a la Tienda"
  end

  def anadir_producto
      @articulo = Articulo.find(params[:id])
      @carro = sesion_carrito
      @carro.add_cesta(@articulo)
      flash[:info] ="Producto añadido #{@articulo.nombre}"      
      redirect_to inicio_url
  end

  def ver_carro    
      @carro = session[:carro]    
  end

  def vaciar_carrito
      session[:carro] = nil
      flash[:info] = "Carrito vacio"
      redirect_to inicio_url
  end

  private

  def sesion_carrito
      session[:carro] ||= Carro.new
  end
end

2 个答案:

答案 0 :(得分:0)

我相信你并没有真正将实例变量设置为购物车。

也许session[:carro]包含的不是购物车? 你能否发布完整的错误信息,因为这会澄清你的问题。

现在尝试设置:

@carro = Carro.new

然后稍微重构会话部分。

- 编辑 -

似乎会话变量是字符串而不是实际对象。

尝试将cart_id存储在会话中,稍后再检索。

def ver_carro
  @carro ||= (Carro.find(session[:carro_id]) || Carro.new)
end

有类似的东西。

答案 1 :(得分:-1)

您无法访问控制器中的方法,因为它是在单独的类中定义的。您需要通过要求控制器类中的文件显式提供访问权限。将路径放在引号中的实际文件中。在此处查看类似问题:Including a Ruby class from a separate file

require 'file_path/carro'
  class TiendaController < ApplicationController