xdougx / api-moip-assinaturas

gem para a api do MOIP Assinaturas
Other
6 stars 7 forks source link

NameError (uninitialized constant PlansController::Moip) #3

Open tlluiz opened 11 years ago

tlluiz commented 11 years ago

Olá! Estou usando a gem com ruby 2.0 e rails 4.0 e localmente tudo funciona perfeitamente, porém quando coloco em produção com Unicorn e Nginx recebo a seguinte mensagem de erro:

NameError (uninitialized constant PlansController::Moip):
app/controllers/plans_controller.rb:4:in `index`

O código que gera o erro em produção:

class PlansController < ApplicationController
  layout 'admin'
  def index
    plan = Moip::Plan.new
    plan.load
    @plans = plan.plans
  end
end

Será que podem me ajudar?

Desde já agradeço a atenção.

tlluiz commented 11 years ago

Na verdade o erro acontece no Unicorn e a aplicação para de funcionar:

/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require': cannot load such file -- moip (LoadError)
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `block in require'
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require'
/releases/20130716120224/config/initializers/moip_assinaturas.rb:1:in `<top (required)>'

No initializer está assim:

require 'moip'
require 'moip/configuration'

Moip.configure do |config|
  config.token = "meu_token"
  config.acount_key = "minha_chave"
end

Gemfile:

gem 'api-moip-assinaturas', git: 'git://github.com/xdougx/api-moip-assinaturas.git', require: 'moip'
xdougx commented 11 years ago

Ngix e Unicorn, eu uso unicorn no Heroku támbem e não tive esse problema, vou tentar reproduzir esse erro tentando usar dentro do controller a função, mas acho muito estranho esse de require. Eu venho desenvolvendo dentro do model as minhas funcionalidades. Vou tentar aqui reproduzir esse erro.

xdougx commented 11 years ago

Em seu gemfile o gem 'api-moip-assinaturas'... ele está fora de grupos correto? Eu subi um teste igual o seu e tive sucesso em imprimir os conteúdos. Faz um teste, tenta criar uma função dentro de um model, por exemplo Plan.

class Plans
  def self.teste
    puts @plan = Moip::Plan.new
    puts @plan.load
    puts @plan.plans
  end
end

Tenta usar a função dentro do controller

  def index
    Plans.teste
  end

Aproveita e faz um bundle update, eu fiz algumas pequenas alteração támbem.

tlluiz commented 11 years ago

Sim! No Gemfile está fora de qualquer grupo. O que é mais estranho é que rodando unicorn localmente também funciona perfeitamente.

Vou tentar colocar dentro de um model como você sugeriu. Estava usando dessa forma, mas mudei por achar desnecessário. Depois posto os resultados. (Aproveito para dar o bundle update)

Desde já agradeço a ajuda.

tlluiz commented 11 years ago

Ainda sem sucesso!

Criei um model chamado "Plans":

class Plans
  def self.list
    plan = Moip::Plan.new
    plan.load
    plan.plans
  end

  def self.new
    Moip::Plan.new
  end

  def self.build(params)
    Moip::Plan.build params
  end

  def self.activate(id)
    plan = Moip::Plan.new
    plan.find id
    plan.activate
  end

  def self.inactivate(id)
    plan = Moip::Plan.new
    plan.find id
    plan.inactivate
  end

  def self.show(id)
    plan = Moip::Plan.new
    plan.find id
    plan
  end
end

E no controller "PlanController" ficou assim:

class PlansController < ApplicationController
  layout 'admin'
  def index
    @plans = Plans.list
  end

  def new
    @plan = Plans.new
  end

  def show
    @plan = Plans.show params[:id]
  end

  def create
    @plan = Plans.build plan_params
    if @plan.create
      redirect_to plans_path, notice: "Plano criado com sucesso!"
    else
      redirect_to plans_path, alert: "#{Exception.new plan.errors.full_messages.first}"
    end
  end

  def activate
    if Plans.activate params[:id]
      redirect_to plans_path, notice: "Plano ativado com sucesso!"
    else
      redirect_to plans_path, alert: "Não foi possível ativar este plano."
    end    
  end

  def deactivate
    if Plans.inactivate params[:id]
      redirect_to plans_path, notice: "Plano desativado com sucesso!"
    else
      redirect_to plans_path, alert: "Não foi possível desativar este plano."
    end    
  end

private
  def plan_params
    params.require(:plan).permit(:code, :name, :description, :amount, :setup_fee, :max_qty, :length, :unit, :interval, :billing_cycles, :status)    
  end
end

Localmente tudo funciona, mas depois de dar deploy usando capistrano o erro do Unicorn é:

/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require': cannot load such file -- moip (LoadError)
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `block in require'
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require'
/releases/20130718161905/config/initializers/moip_assinaturas.rb:1:in `<top (required)>'

O que percebo é que me parece algum problema com a linha do initializer que chama o módulo da gem:

require 'moip'
require 'moip/configuration'

Moip.configure do |config|
  config.token = "meu_token"
  config.acount_key = "minha_chave"
end
xdougx commented 11 years ago

Tem o backtrace completo do erro?

tlluiz commented 11 years ago

Tenho sim:

/home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require': cannot load such file -- moip (LoadError)
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `block in require'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require'
        from /home/deployer/apps/nome_do_projeto/releases/20130718161905/config/initializers/moip_assinaturas.rb:1:in `<top (required)>'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `block in load'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/engine.rb:609:in `block (2 levels) in <class:Engine>'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/engine.rb:608:in `each'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/engine.rb:608:in `block in <class:Engine>'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:30:in `instance_exec'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:30:in `run'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:55:in `block in run_initializers'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:150:in `block in tsort_each'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:183:in `block (2 levels) in each_strongly_connected_component'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:210:in `block (2 levels) in each_strongly_connected_component_from'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:219:in `each_strongly_connected_component_from'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:209:in `block in each_strongly_connected_component_from'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:44:in `each'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:44:in `tsort_each_child'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:203:in `each_strongly_connected_component_from'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:182:in `block in each_strongly_connected_component'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:180:in `each'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:180:in `each_strongly_connected_component'
        from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:148:in `tsort_each'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:54:in `run_initializers'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/application.rb:215:in `initialize!'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/railtie/configurable.rb:30:in `method_missing'
        from /home/deployer/apps/nome_do_projeto/releases/20130718161905/config/environment.rb:6:in `<top (required)>'
        from config.ru:4:in `require'
        from config.ru:4:in `block in <main>'
        from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `instance_eval'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `initialize'
                from config.ru:1:in `new'
                from config.ru:1:in `<main>'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn.rb:44:in `eval'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn.rb:44:in `block in builder'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:722:in `call'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:722:in `build_app!'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:595:in `init_worker_process'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:615:in `worker_loop'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:500:in `spawn_missing_workers'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:511:in `maintain_worker_count'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:277:in `join'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/bin/unicorn:126:in `<top (required)>'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/bin/unicorn:23:in `load'
                from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/bin/unicorn:23:in `<main>'
        E, [2013-07-18T17:21:55.334749 #23115] ERROR -- : reaped #<Process::Status: pid 28716 exit 1> worker=0
        I, [2013-07-18T17:21:55.335036 #23115]  INFO -- : worker=0 spawning...
        I, [2013-07-18T17:21:55.343780 #29935]  INFO -- : worker=0 spawned pid=29935
        I, [2013-07-18T17:21:55.344178 #29935]  INFO -- : Refreshing Gem list
xdougx commented 11 years ago

O erro diz que quando ele vai fazer o require no initializer ele não encontra o arquivo moip.rb. será que a gem está realmente instalando dentro do server? tem como ver se a gem está instalada? por que eu não tenho idéia do que pode estar acontecendo dentro do seu server, pois eu uso o Heroku, com unicorn e eu sei que o heroku támbem usa ngix, mas isso não tem nada a ver.

tlluiz commented 11 years ago

Pois é! Um pouco bizarro.

Estou fazendo mais um teste aqui, pois vejo o capistrano executando o bundle install no servidor.

Mais uma vez agradeço pela ajuda.

Volto com novidades.

xdougx commented 11 years ago

Blz, fico no aguardo!

tlluiz commented 11 years ago

Douglas,

O pior é que a gem está lá! Instalada perfeitamente.

O pior é que antes eu tinha usado a gem moip-assinaturas, que tem menos recursos, mas também hora que subiu para o servidor tive o mesmo problema.

Muito estranho. :(

Chegou a usar essa gem com rails 4?

xdougx commented 11 years ago

ainda não usei com o rails 4, mas eu uso o ActiveSuport 4, então não deveria ter esse problema, a gem do moip-assinaturas ainda está instalada?

tlluiz commented 11 years ago

Está, mas não incluída no Gemfile. Será esse o problema?

tlluiz commented 11 years ago

Acabei de desinstalar, mas o cenário não mudou.

xdougx commented 11 years ago

Faz um teste no servidor, consegue abrir um Irb e tenta carregar manualmente o gem para ver o que acontece.

tlluiz commented 11 years ago

Douglas primeiramente tentei rodar o IRB usando bundle exec irb de dentro da pasta do projeto no servidor e ao tentar carregar a gem com require 'moip' deu erro como estava dando no unicorn. Isso era o esperado, pois conseguir carregar a gem dentro do projeto manualmente ia ser muito incoerente.

Fui procurar o comando que o capistrano executa no servidor para instalar as gems:

bundle install --path /home/deployer/apps/nome_do_projeto/shared/bundle

Isso instala as gems em um path diferente do esperado para a maioria das gems, mesmo que eu esteja usando rbenv.

Depois das descobertas instalei a gem api-moip-assinaturas usando gem install api-moip-assinaturas, porém fora da pasta do projeto. O que provocou a instalação da gem e todas as suas dependências dentro do path padrão do rbenv.

Executando o IRB sem o bundle exec e fora da pasta do projeto consegui carregar a gem, porém dentro da pasta do projeto com bundle exec não carrega.

Agora me corrija se estiver falando alguma besteira, mas não parece que será necessário adicionar alguma dependência do bundler na gem api-moip-assinaturas? Pois assim o bundler vai achar a gem instalada dentro do path do projeto e carregá-la corretamente?

xdougx commented 11 years ago

Se você olhar o gemspec do api-moip-assinaturas, vai ver que ele tem as dependencias declaradas:

  s.add_development_dependency 'httparty', '~> 0.11.0', '>= 0.11.0'
  s.add_development_dependency 'json', '~> 1.7.7', '>= 1.7.7'
  s.add_development_dependency 'activemodel', '~> 3.2.12', '>= 3.2.12'
  s.add_development_dependency 'i18n', '~> 0.6.1', '>= 0.6.1'

  s.add_dependency 'httparty', '>= 0.11.0'
  s.add_dependency 'json', '>= 1.7.7'
  s.add_dependency 'activemodel', '>= 3.2.12'
  s.add_dependency 'i18n', '~> 0.6.1', '>= 0.6.1'
tlluiz commented 11 years ago

Acho que consegui resolver.

xdougx commented 11 years ago

O que foi feito?

tlluiz commented 11 years ago

Sou novato nessa história de contribuição a outros projetos, mas basicamente o que eu fiz foi criar um arquivo Rakefile com o carregamento do bundle/gem_tasks e mudar a forma como a gem busca o path dos arquivos no gemspec. Dei um pull request na gem. Desde já peço desculpa caso tenha feito alguma besteira, mas foi a forma que consegui resolver o problema. Caso tenha feito de forma errada por favor me oriente, ok?