Posts Tagged ‘module’

Ruby on Rails exemplo de helper para detectar o navegador

Postado em 30 jul 2009
Categoria(s) Ruby on Rails

Esse é um exemplo simples e sucinto de um helper para detectar o navegador do usuário.

Segue abaixo o código:

module BrowserDetectHelper
  def browser_is? name
    browser_name == name
  end
 
  def browser_name
    ua = request.user_agent.downcase
 
    if ua =~ /firefox\//
      :firefox
    elsif ua =~ /opera\//
      :opera
    elsif ua =~ /chrome\//
      :chrome
    elsif ua =~ /safari\//
      :safari
    elsif ua =~ /msie/
      :ie
    else
      nil
    end
  end
end

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Ruby on Rails configurando ambiente de desenvolvimento no Linux

Postado em 25 jun 2009
Categoria(s) Ruby on Rails

Nesse post vou mostrar como configurar um ambiente de desenvolvimento em Ruby on Rails no Linux.

Vamos lá!

Atualizando os pacotes do Linux:

sudo apt-get update

Instalando Ruby on Rails:

1
2
3
4
5
6
7
8
9
10
sudo apt-get install ruby irb rdoc ruby1.8-dev libopenssl-ruby imagemagick curl
wget http://rubyforge.org/frs/download.php/57643/rubygems-1.3.4.tgz
tar xzvf rubygems-1.3.4.tgz
cd rubygems-1.3.4
sudo ruby setup.rb
cd /usr/bin
sudo ln -s gem1.8 gem
sudo gem update --system
sudo apt-get install build-essential
sudo gem install rails passenger mongrel capistrano

Instalando Apache com PHP e Passenger/Modrails:

O Passenger/Modrails permite rodar aplicações Ruby on Rails no Apache.
Nessa etapa nós também iremos instalar o PHP, vamos precisar dele para o phpMyAdmin.

1
2
sudo apt-get install apache2 php5 libapache2-mod-php5 apache2-prefork-dev libapr1-dev
sudo passenger-install-apache2-module

Agora nós precisamos configurar o Apache para carregar o módulo do Passenger:

sudo gedit /etc/apache2/mods-enabled/passenger.load

Adicione as seguintes linhas no arquivo em branco:

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.4/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.4
PassengerRuby /usr/bin/ruby1.8
RailsEnv development

Salve o arquivo e feche o gedit.

Reinicie o Apache para carregar o Passenger:

sudo /etc/init.d/apache2 restart

Instalando o MySQL:

1
2
sudo apt-get install mysql-server libmysql-ruby php5-mysql
sudo apt-get install phpmyadmin

Configurando acesso a sua aplicação Ruby on Rails:

Digamos que você tenha o código da sua aplicação Ruby on Rails no diretório:

/home/patrick/projetos/minha_aplicacao

Vamos configurar para que quando você digitar no navegador http://minha_aplicacao você veja a sua aplicação em ambiente de desenvolvimento e possa interagir com ela.

Para isso, siga os passos abaixo:

cd /etc/apache2/sites-available/

Vamos criar um novo host novo virtual host no Apache:

sudo gedit minha_aplicacao

No arquivo em branco adicione:

<VirtualHost *:80>
ServerName minha_aplicacao
DocumentRoot /home/patrick/projetos/minha_aplicacao/public/
</VirtualHost>

Salve e feche o gedit.

Vamos deixar esse virtual host disponível:

1
2
cd /etc/apache2/sites-enabled/
sudo ln -s ../sites-available/minha_aplicacao 001-minha_aplicacao

Agora vamos configurar para que quando você digitar no navegador http://minha_aplicacao o sistema operacional procure localmente ao invés de buscar na internet:

sudo gedit /etc/hosts

Nesse arquivo adicione a linha:

127.0.0.1	minha_aplicacao

Logo abaixo da linha que começa com 127.0.1.1…
Salve e feche o gedit.

Reinicie o Apache para carregar esse novo virtual host:

sudo /etc/init.d/apache2 restart

Abra o navegador:

Digite no browser http://minha_aplicacao e veja ela rodando.

Se você quiser usar o Vim como IDE de desenvolvimento Ruby on Rails leia esse post: http://blog.patrickespake.com/2009/04/21/usando-o-vim-para-programar-em-ruby-on-rails/.

Pronto!

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Ruby on Rails como resolver A copy of … has been removed from the module tree but is still active!

Postado em 26 mar 2009
Categoria(s) Ruby on Rails

Eu estou desenvolvendo um CMS em Ruby on Rails 2.3, um dos requisitos desse CMS é um alto grau de componentização em módulos.

Eu fiquei 1 semana pensando como poderia fazer isso da melhor forma no Rails, foi ae que eu descobri o Rails Engines no Rails 2.3, eu percebi que através dele eu conseguiria dividir a minha aplicação em módulos.

O Rails Engines permite embutir uma aplicação dentro da outra, para você entender melhor veja esse Railscasts: http://railscasts.com/episodes/149-rails-engines e http://rails-engines.org.

Eu consegui embutir uma aplicação dentro da outra e modularizar o funcionamento do meu CMS.

Tudo estava funcionando lindo e maravilhosamente na primeira requisição a página, por exemplo: http://localhost:3000/admin/node_types mas quando eu fiz a segunda requisição me deparei com essa mensagem de erro:

A copy of BackendController has been removed from the module tree but is still active!

E depois disso a página parou de funcionar e só aparecia essa mensagem de erro, fui atrás para descobrir o que era.

Pelo o que eu entendi o Rails carrega o conteúdo do plugin uma vez só, e depois faz o descarregamento das classes da memória, na segunda vez que você tenta acessar a classe ela não está mais na memória e dá problema.

No meu caso é a classe BackendController herdada pelo controlador do plugin Admin::NodeTypesController.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class Admin::NodeTypesController < BackendController
 
  # GET /admin/node_types
  # GET /admin/node_types.xml
  def index
    @node_types = NodeType.all
 
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render : xml => @node_types }
    end
  end
 
  # GET /admin/node_types/1
  # GET /admin/node_types/1.xml
  def show
    @node_type = NodeType.find(params[:id])
 
    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render : xml => @node_type }
    end
  end
 
  # GET /admin/node_types/new
  # GET /admin/node_types/new.xml
  def new
    @node_type = NodeType.new
 
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render : xml => @node_type }
    end
  end
 
  # GET /admin/node_types/1/edit
  def edit
    @node_type = NodeType.find(params[:id])
  end
 
  # POST /admin/node_types
  # POST /admin/node_types.xml
  def create
    @node_type = NodeType.new(params[:node_type])
 
    respond_to do |format|
      if @node_type.save
        flash[:notice] = 'Criado com sucesso.'
        format.html { redirect_to([:admin, @node_type]) }
        format.xml  { render : xml => @node_type, :status => :created, :location => @node_type }
      else
        format.html { render :action => "new" }
        format.xml  { render : xml => @node_type.errors, :status => :unprocessable_entity }
      end
    end
  end
 
  # PUT /admin/node_types/1
  # PUT /admin/node_types/1.xml
  def update
    @node_type = NodeType.find(params[:id])
 
    respond_to do |format|
      if @node_type.update_attributes(params[:node_type])
        flash[:notice] = 'Atualizado com sucesso.'
        format.html { redirect_to([:admin, @node_type]) }
        format.xml  { head : ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render : xml => @node_type.errors, :status => :unprocessable_entity }
      end
    end
  end
 
  # DELETE /admin/node_types/1
  # DELETE /admin/node_types/1.xml
  def destroy
    @node_type = NodeType.find(params[:id])
    @node_type.destroy
 
    respond_to do |format|
      format.html { redirect_to(admin_node_types_url) }
      format.xml  { head : ok }
    end
  end
end

Eu descobri duas soluções para resolver esse problema:

A primeira é fazer em que toda a requisição ao controlador Admin::NodeTypesController a classe BackendController será recarregada novamente adicionado load ‘backend_controller.rb’:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
load 'backend_controller.rb'
 
class Admin::NodeTypesController < BackendController
 
  # GET /admin/node_types
  # GET /admin/node_types.xml
  def index
    @node_types = NodeType.all
 
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render : xml => @node_types }
    end
  end
 
...

A segunda forma é dizer que a classe não deve ser descarregada, adicionando unloadable dentro da classe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Admin::NodeTypesController < BackendController
  unloadable
 
  # GET /admin/node_types
  # GET /admin/node_types.xml
  def index
    @node_types = NodeType.all
 
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render : xml => @node_types }
    end
  end
 
...

Essas soluções eu encontrei nos seguintes links:

Obs.: Eu coloquei um espaço onde aparece : xml, entre o : e xml, tive que fazer isso senão o wordpress fica adicionado imagens de smily no meio do código. Mesma coisa para : ok. erggg

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Traduzindo a mensagem do helper page_entries_info do plugin will_paginate

Postado em 17 jan 2009
Categoria(s) Ruby on Rails

Hoje precisei traduzir a mensagem exibida pelo helper page_entries_info do plugin will_paginate. Descobri que esse helper não possui nenhum parâmetro para traduzir suas mensagens.

Para solucionar esse problema eu sobrescrevi esse helper no ApplicationHelper:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Methods added to this helper will be available to all templates in the application.
module ApplicationHelper
  def page_entries_info(collection, options = {})
    entry_name = options[:entry_name] ||
      (collection.empty?? 'entry' : collection.first.class.name.underscore.sub('_', ' '))
 
    if collection.total_pages < 2
      case collection.size
      when 0; "Nenhum(a) #{entry_name.pluralize} encontrado(a)"
      when 1; "Exibindo <b>1</b> #{entry_name}"
      else;   "Exibindo <b>todos(as) #{collection.size}</b> #{entry_name.pluralize}"
      end
    else
      %{Exibindo #{entry_name.pluralize} <b>%d&nbsp;-&nbsp;%d</b> de <b>%d</b> no total} % [
        collection.offset + 1,
        collection.offset + collection.length,
        collection.total_entries
      ]
    end
  end
end

E no template eu chamo normal:

1
2
<%= page_entries_info @histories, :entry_name => '' %>
<%= will_paginate(@histories, :previous_label => '«', :next_label => '»') %>

Adoro o Ruby on Rails por causa dessas coisas. ;-)

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Symfony 1.1 carregando Prototype e Scriptaculous no template

Postado em 30 set 2008
Categoria(s) Symfony

Para carregar o Prototype e Scriptaculous em um template no symfony, basta criar o arquivo view.yml dentro do diretório config no módulo da sua aplicação. Por exemplo:

1
apps/frontend/modules/products/config/view.yml

No arquivo view.yml coloquei o nome do template do módulo que você deseja adicionar as bibliotecas javascripts.

1
2
showSuccess:
  javascripts: [%SF_PROTOTYPE_WEB_DIR%/js/prototype, %SF_PROTOTYPE_WEB_DIR%/js/scriptaculous?load=effects]

ou use all para todos os templates do módulo.

1
2
all:
  javascripts: [%SF_PROTOTYPE_WEB_DIR%/js/prototype, %SF_PROTOTYPE_WEB_DIR%/js/scriptaculous?load=effects]
  • Share/Bookmark