May
17
Posted on 17-05-2009
Filed Under (Rails, ruby) by Leandro Nunes on 17-05-2009

Eu perdi algum tempo procurando uma forma de acessar objetos via ActiveResource de uma aplicação servidora para uma cliente.

O meu problema era que o nome do meu resource na aplicação cliente não era a correspondência exata do nome esperado no meu servidor.

Trocando em miúdos…

Eu tenho uma aplicação servidora com o seguinte controller:


class CategoriesController < ApplicationController

  def index
    @categories = Category.all
    respond_to do |format|
      format.json { render :json => @categories }
    end
  end

end

e outra aplicação cliente com o seguinte resource:


class RemoteCategory < ActiveResource::Base

  self.site = http://localhost
  self.format = :json

end

A minha aplicação servidora roda na porta 3000, e a cliente na porta 3001.

O problema é que utilizando somente este código no meu resource, ele vai procurar pelo recurso no meu servidor utilizando o caminho:

http://localhost/remote_categories.json

O problema é que o meu servidor, obviamente ;) , não tem esta rota. Uma vez que o controller que ele possui tem nome categories, gerando portanto a rota:

http://localhost/categories.json

Entretanto eu não podia modificar o nome do meu resource para Category, pois eu já possuía um outro model com este nome na aplicação.

Então depois de perder alguns minutos encontrei a solução.

Basta definir o nome do elemento no resource. Neste caso em particular definir o element_name no objeto RemoteCategory:


self.element_name = 'category'

A configuração final do resource RemoteCategory fica então:


class RemoteCategory < ActiveResource::Base

  self.element_name = category
  self.site = http://localhost
  self.format = :json

end

Espero que seja útil para outras pessoas ;)

eXTReMe Tracker