2012-09-26 1 views
7

Я пытаюсь получить данные из библиотеки третьей стороны, которая имеет API, который выглядит как:ActiveResource, как получить ресурс из REST API, который имеет уникальное имя?

https://foo.com/user.json?username=<USERNAME>

Я не могу понять, как заставить ActiveResource использовать «user.json» вместо "users.json". Является ли это возможным?

Я получил это, работая с реактивной драгоценностью ... есть ли способ сделать это только в чистых ActiveResources?

ответ

8
class User < ActiveResource::Base 
    self.element_name = "user" 
end 

Далее, вы собираетесь спросить, как получить один элемент из URL, который выглядит на ActiveResource быть //foo.com/user.json вместо //foo.com/user/.json

User.find(:one, :from => "https://foo.com/user.json?username=#{<USERNAME>}" 

Редактировать в ответ на комментарий

есть ли способ сделать это без того, чтобы ввести полный URL запроса каждый раз, когда я хочу использовать находку()?

Один из способов - определить метод в классе для полного URL-адреса для вас.

class User < ActiveResource::Base 
    self.element_name = "user" 

    def self.find_by_username(username) 
    find(:one, :from => "https://foo.com/user.json?username=#{username}" 
    end 

    def find 
    self.class.find(:one, :from => "https://foo.com/user.json?username=#{username}" 
    end 
end 

Другой способ - переопределить element_path.

class User < ActiveResource::Base 
    self.element_name = "user" 

    def self.element_path(id, prefix_options = {}, options = {}) 
    "https://foo.com/user.json?username=#{prefix_options["user_id"]}" 
    end 
end 

Некоторые назвали бы это обезглавливанием обезьян, другие назвали бы это объектно-ориентированным программированием. Я говорю, что это только переключение на обезьяны, когда вы идете в код или используете динамическую природу Ruby, чтобы изменить базовое поведение, и это вполне законный способ сделать что-то в объектно-ориентированном программировании. Тем не менее, сообщество Ruby не использует ООП, почти игнорируя наследование в пользу гораздо более слабых (и менее хорошо себя зарекомендовавших) миксов, и только используя утиную типизацию для полиморфизма.

Проблемы с необходимостью связываться с ActiveResource для создания URL-адреса, где вы не можете переопределить веб-службу для принятия соглашений ActiveResource, - это то, почему многие используют HTTParty. «Если вы должны построить URL, может также использовать HTTParty»

+0

Есть ли способ для этого без необходимости вводить полный URL-адрес запроса каждый раз, когда я хочу использовать find()? –

+0

Вы просили об этом. Ответ отредактирован. –

+1

Вы можете использовать 'site' и' prefix', чтобы составить первую часть URL-адреса. – funwhilelost

2

Если вам нужно только, чтобы избавиться от имени ресурса плюрализацией в URL, переопределяют collection_name:

class User < ActiveResource::Base 
    self.element_name = "user" 

    def self.collection_name 
    element_name 
    end 
end