2016-04-08 1 views
0

У меня есть модель @record_request, которая принимает уникальный идентификатор и сохраняет его в базе данных. Затем модель может быть использована для запуска множества запросов API внешняя база данных для выполнения этой работы.Как проверить достоверность значения на основе вызова API

Вещь, я не хочу, чтобы пользователь мог сохранить значение в приложении Rails, если он не может быть запрошен в удаленной базе данных.

Я попытался создать валидации и создавать тесты RSpec, но все они требуют моего @current_user переменных со всеми api_token и referesh_token и другими вкусности OmniAuth, необходимых для того, чтобы autenticated вызова API ...

Так что я м. Где место наилучшей практики, чтобы поставить правило валидации такого рода.

Я думаю, что мне нужно будет что-то поставить в моем контроллере на :create, что делает звонок там и поднимает ошибки/вспышки таким образом ... но тогда кажется, что у меня есть загрузка кода на моем контроллер, и я упал за fat controller anti-pattern, нет?

Какая практика?

+0

Оба [toddmetheny-х] (http://stackoverflow.com/users/1378252/toddmetheny) и [Druid's] (http://stackoverflow.com/users/3172183/druid), я закончил тем, что использовал код Друида, хотя так ответил на это. – Huw

ответ

1

Вот пример из проекта, я работаю, этот код записывается в модели

after_validation :should_validate_match?, on: [:create, :update] 


    def should_validate_match? 
    if self[:type] == 'Match' 
     self.answers.each{|ans| self.errors.add(:answer, "match cannot be null") if ans.match.blank?} 
    end 

    self.errors.empty? 
    end 
+0

Интересно, так что это работает от контроллера (на основе [: create, : update]?), как это работает с методом after_validation? Разве это не будет вещь ActiveModel? – Huw

+0

Нет, обратные вызовы заданы в модели, попробуйте использовать это и скажите мне, что происходит при создании/обновлении. – amrdruid

+0

Не могли бы вы распаковать для меня строку 'self.answers.each', угадав как' ответы', так и 'type 'поля с вашей модели? Это хранит массив или что-то, что вы перебираете, чтобы добавлять ошибки в отдельный элемент? – Huw

1

Вы можете протестировать аутентификацию в пользовательском методе, вызванном обратным вызовом before_save в вашей модели.

Что-то вроде:

before_save :do_this 

def do_this 
    if name_of_attribute.blank? 
    return 
    else 
    # api call to test authentication 
    end  
end 

Если запрос на запись имеет ссылку на пользователя, не должны иметь доступ к current_user помощника.

+0

'api_call_to_test_authentication, если name_of_attribute.blank?' Будет более чистым для вашего экземпляра. – Ilya

+0

Да, я думаю, что это интересная ставка, но это будет частный метод из моего контроллера, верно? Вы не беспокоитесь, что это антипаттерн? Если в модели все еще возникает проблема с тем, как/должен ли он обращаться к сеансу/'@current user' stuff – Huw

+0

Нет. Обратные вызовы идут в модели. Если вы не можете сохранить user_id в объекте, вы также можете просто вызвать метод из контроллера и передать его current_user. – toddmetheny

Смежные вопросы