segunda-feira, 16 de julho de 2012

Instalando CkEditor no Rails 3


Comecei a "brincar" com Ruby on Rails 3 graças à influência de um amigo. Desenvolver usando esse framework é algo muito divertido. 
Tudo estava indo bem até esbarrar em um problema: Precisava usar um editor html em um campo de texto do meu site (um dos vários que fiz apenas com fins didáticos) e não sabia como implementar um. A tarefa parecia ser mais difícil pelo fato de estar utilizando a gem Rails Admin para criar o painel administrativo do site. Foi então que encontrei no github uma versão do ckeditor para Rails que era compatível com essa gem.
Já conhecia o CkEditor de "outros carnavais", então resolvi seguir os passos do turorial de instalação contido nele. Para minha surpresa, não consegui instalá-lo (sim, achei isso estranho. Em geral, as coisas são bem simples de serem feitas no Rails). Resolvi estudar a documentação um pouco mais a fundo e depois de alguns testes, descobri a melhor forma de instalá-lo.

Nesse exemplo, quero usar o CkEditor no meu módulo Posts, que possui apenas título e conteúdo (onde quero utilizar o editor).

Primeiramente, precisamos modificar o arquivo Gemfile, para adicionar a lista de gems que iremos utilizar no projeto. Basicamente, usei RailsAdmin para o painel, Paperclip para upload de imagens, Therubyracer para javascript e Devise para autenticação.


No seu Gemfile, adicione as seguintes linhas:

gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git'
gem 'paperclip' 
gem 'therubyracer'
gem 'ckeditor'
gem 'devise'

Para instalar todas as gems listadas no Gemfile, execute o comando bundle install:
bundle install

Depois de devidamente instaladas, gere os arquivos necessários ao CkEditor usando o comando abaixo. os parâmetros 'path' e 'backend' são o "pulo do gato" desse passo-a-passo, pois vão configurar o caminho dos scripts e a gem responsável pelo upload dos arquivos respectivamente:

$ rails generate ckeditor:install --path=public/assets --backend=paperclip

Feito isso, é necessário gerar o model do CkEditor (sim, ele possui um model):

$ rails generate ckeditor:models

O CkEditor utiliza o banco de dados para gravar os meta-dados dos arquivos enviados pelo seu sistema de upload. Ele não funcionará sem isso. Crie o arquivo db/migrate/create_ckeditor.rb com o seguinte conteúdo:


class CreateCkeditor < ActiveRecord::Migration
  def self.up
    create_table :ckeditor_assets do |t|
      t.string  :data_file_name, :null => false
      t.string  :data_content_type
      t.integer :data_file_size
    
      t.integer :assetable_id
      t.string  :assetable_type, :limit => 30
      t.string  :type, :limit => 30
  
      # Uncomment it to save images dimensions, if your need it
#     t.integer :width
#     t.integer :height
  
      t.timestamps
    end
  
    add_index "ckeditor_assets", ["assetable_type", "type", "assetable_id"], :name => "idx_ckeditor_assetable_type"
add_index "ckeditor_assets", ["assetable_type", "assetable_id"], :name => "idx_ckeditor_assetable"
  end
end

Com esse arquivo, você poderá criar a tabela responsável por gravar os meta-dados que o editor precisa. crie a base de dados usando o rake:

rake db:migrate

Agora, para finalizar (até que enfim), configure o rails_admin para usar o ckeditor, adicionando o conteúdo abaixo no model correspondente:

rails_admin do
  RailsAdmin.config do |config|
    config.model Post do
      create do
        field :titulo
        field :conteudo do
          ckedior true
        end
      end
    end
  end
end

Isso deve ser suficiente. Nesse caso, coloquei esse conteúdo no meu model Post. Assim, toda vez que ele for carregado, irá configurar o campo 'conteudo' para usar o CkEditor.  Para mais detalhes, consulte o manual do Rails Admin.

2 comentários:

  1. Olá!

    Vc teve algum problema para por em produção? Eu estou usando só o ckeditor, sem o rails admin. Quando mando para produção o text area não é afetado pelo ckeditor.

    Estou fazendo deploy no heroku. No heroku logs não dá nenhum erro.

    No console do javascript tenho o seguinte erro:
    Uncaught ReferenceError: CKEDITOR is not defined
    Mas esse erro aparece em desenv. também, porém funciona normal.
    Já li várias sugestões pela net uma delas era subscrever o init.js da gem e colocar um na pasta app/assets/js

    Quando fiz isso localmente passei a ter o mesmo comportamento que no servidor. Como o init.js no exemplo que encontrei servia pra definir o CKEDITOR_BASEPATH pensei que talvez tenha alguma coisa a ver com o ruby encontrar o ckeditor.

    No meu production.rb tenho a seguinte linha que também foi sugestão em alguma discussão no stackoverflow:

    config.assets.precompile += %w( ckeditor/* )

    Agradeço qualquer colaboração.

    ResponderExcluir
  2. Olá.

    Mesmo usando o rails_admin, passei por um problema parecido. Só consegui fazer o ckeditor funcionar depois de usar esse comando:

    $ rails generate ckeditor:install --path=public/assets --backend=paperclip

    O parâmetro --path indica onde estão os arquivos js e css usados pelo editor. Sem ele, o ckeditor não consegue encontrá-los e falha.

    Não testei isso sem o rails_admin (na verdade, dei uma pausa com o Rails no momento), mas espero que isso ajude...

    ResponderExcluir