2016-10-12 48 views
0

使用表單輸入API密鑰,我想在保存表單之前檢查API密鑰是否返回有效的響應。否則,它只會返回帶有錯誤消息的表單(如常見的驗證錯誤)。Rails:API調用的表單驗證

我試圖通過計算器:How do I perform validation on an api call while submitting form and produce necessary error message?

我測試了驗證代碼,它的工作原理,但我在控制器中。我是使用Rails新API,但我相信表單驗證應該在模型中完成......但是一旦我將代碼放入模型中,它就會出錯。

這是我在控制器:

meetup_apikey = @group.meetup_apikey 
group_urlname = @group.meetup_urlname 

url = "https://api.meetup.com/2/events?key=#{meetup_apikey}&sign=true&photo-host=public&group_urlname=#{group_urlname}" 

    def test_api_responds_correctly(dataurl) 
    response = HTTParty.get(dataurl) 
    puts "\nAPI Response success: #{response.success?}\n\n" 

    case response.success? 
    when true 
     puts "-------" 
     puts "API Response code: #{response.code}" 
     puts "API Response message: #{response.message}" 
     puts "API Response body: #{response.body}" 

     puts 
     else 
     flash[:error] = "Invalid API key or group urlname" 
     end 
    end 

    # start the program 
    test_api_responds_correctly(url) 

如果我輸入了正確的API密鑰和有效組URL名稱。所述終端返回:

API Response success: true 

------- 

API Response code: 200 

API Response message: OK 

API Response body: {"results":[{"utc_offset":-25200000,"venue":... }} 

並且用戶被重定向到一個頁面中輸入的信息和一個以上消息Group has been successfully updated

如果我輸入了無效的API密鑰,終端的回報:

API Response success: false 

而且用戶會被重定向到與輸入的信息的頁面。上面有Group has been successfully updatedInvalid API key or group url name消息。

這不是我想要的,我希望表單返回一個常見的驗證錯誤,並保留在表單頁面上,直到API響應有效。我試圖將代碼放入模型中,但我得到一個undefined method 'test_api_responds_correctly'錯誤。

任何建議和見解都會有幫助。謝謝!

回答

1

您需要在您的組模型一樣,創建自定義validation method

validates :meetup_apikey, :meetup_urlname, presence: true 
validate :api_key_valid? 

def api_key_valid? 
    url = "https://api.meetup.com/2/events?key=#{meetup_apikey}&sign=true&photo-host=public&group_urlname=#{meetup_urlname}" 
    if !HTTParty.get(dataurl).success? 
    errors.add(:meetup_apikey, "needs to be valid") 
    end 
end 

是企圖沒有meetup_apikey創建組後與meetup_urlname會導致違約的必要屬性不存在驗證錯誤,當他們卻無效meetup_apikey的錯誤將出現在驗證中。

+0

謝謝你的@Sergey Moiseev,我遵循你的評論,它的工作。我不知道你可以爲API調用編寫自定義驗證方法,而我最近才發現了httparty gem(昨天)。如果API響應無效,現在表單驗證完美地工作,刷新表單並驗證錯誤出現在':meetup_apikey'字段中。 – teresa

+0

歡迎!即使在2007年使用Rails之後,我自己也會不時地抓取guides.rubyonrails.org,以確保我不會錯過某些東西:) –