terça-feira, 11 de maio de 2010

Configurando contexto(Routes and namespace)

Bem, hoje enfrentei mais um problema na minha saga, aprendendo a trabalhar com o ruby, como estou criando uma página de administração eu queria agrupar todo o conteúdo que virá será manipulado pelo administrado numa pasta chamada admin.
Até aí super tranquilo, como todo bom brasileiro não li a documentação inteira, vamos aos meus problemas. Primeiro queria gerar um CRUD(Create, Retrieve, Update e Delete) dentro da pasta, então para criar um usamos um scaffold, então criei digitei:

script/generate scaffold Admin/Menu name:string description:string

Milagrosamente a pasta admin foi criada e as coisas separadas, algo bem parecidos como criado um package no java ou namespace no C#(linguagens que sou mais familiarizado).

Pensei comigo mesmo, claro essa foi simples até de mais, só que ai feliz da vida fui rodar o site e ERRO, ele afirmava que a variavel @menu estava nula, achei estranho mas coloquei um if lá para verificar se o menu era nil.

Quando cliquei em new menu, que ele chamaria a página new, ele me joga uma dessa:

uninitialized constant MenusController

e um stack meio inutil.

C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:443:in `load_missing_constant'
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:80:in `const_missing'
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:92:in `const_missing'
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/inflector.rb:361:in `constantize'
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/inflector.rb:360:in `each'
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/inflector.rb:360:in `constantize'
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/core_ext/string/inflections.rb:162:in `constantize'
C:/Ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/routing/route_set.rb:443:in `recognize'
C:/Ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/routing/route_set.rb:436:in `call'

Pensei com meus botões, deve ser problema na configuração de routes, já que ele não encontrou o controller, e pensei logo e scaffold não gera essa parte corretamente, então como fazer?

Depois de algumas tentativas e muitos erros, e documentação digerida(não lida obviamente), chego a conclusão que resolve o problema, o uso de:

map.namespace(:admin) do |admin|
admin.resources :menus
end

Onde eu digo que dentro da pasta admin, será encontrado todas as referencias dos menus, pronto, problema com routes resolvido.
Agora o pior dos problemas foi resolvido apenas substitua onde tem *menu_path por *admin_menu_path e no controller onde recebe o valor :menu para :admin_menu

Ruby on Rails e Mysql

Bem comecei a programar em ruby, e já tive um problema que acho que vale a pena colocar aqui, é relativamente simples, eu preciso criar uma aplicação ruby que acesse o mysql. Simples?

Pois comigo deu o seguinte erro:

!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.
rake aborted!
126: The specified module could not be found. - C:/Ruby/lib/ruby/gems/1.8/gems/mysql-2.8.1-x86-mswin32/lib/1.8/mysql_api.so

(See full trace by running task with --trace)


Depois de um certo tempo de pesquisas, descobri que o MySql 5.1 não funciona direito com o Rails, então o que fazer?

Baixe a versão mais antiga da Dll do MySql: http://instantrails.rubyforge.org/svn/trunk/InstantRails-win/InstantRails/mysql/bin/libmySQL.dll.
Em seguida cole a dll na pasta bin do seu ruby, no meu caso fica no C:\Ruby\bin. Agora só reiniciar o mysql e tentar executar novamente.

Pronto, no meu caso o que aconteceu logo em seguida foi reclamar que a database não existe, mas essa é só foi criar uma database e colocar com o mesmo nome no acesso do arquivo do rails database.yml.