2015-06-16 63 views
0

我對Ruby on Rails非常陌生,我希望這將是一個快速解決方案。我有一個非常簡單的表單(名字,姓氏,電子郵件),需要將XML發佈到另一個域上的API。我們網站上的所有內容都是客戶端JavaScript,因此我想在我們的Rails應用程序中發佈到代理以解決跨域問題。Ruby on Rails通過代理使用javascript發佈到API

我發現了這一點的代碼,這似乎是做我想要的 - https://github.com/bitzesty/xml2jsonp,但我不知道如何以及在哪裏安裝這個在我們的Ruby應用程序,所以我可以發佈到它並收到響應。

任何幫助,將不勝感激。

+0

爲什麼不使用標準的POST請求將表單提交給Rails應用程序,並讓rails將XML請求發送給遠程API? – Jon

回答

0

Net::HTTP是Ruby的內置庫,用於發送HTTP請求。 Rails還內置了將模型序列化爲XML的功能。

比方說,你表單綁定到User模式:

class User < ActiveModel::Base 
    # attr_accessor is not needed if these are real DB columns. 
    attr_accessor :firstname 
    attr_accessor :surname 
    attr_accessor :email 
end 

,辦理形式UsersController#create

def UsersController < ApplicationController 
    # POST `/users` 
    def create 
    @user = User.new(user_params) 
    # @todo send user to remote service. 
    end 

    def user_params 
    params.require(:user).permit(:firstname, :surname, :email) 
    end 
end 

然後,我們可以創建一個服務對象,職位用戶遠程API

# app/services/user_posting_service 
class UserPostingService 

    attr_accessor :user 
    attr_accessor :client 

    # Passing in the client lets us easily stub Net::HTTP in tests 
    def initialize(user, client = Net::HTTP) 
    @user = user 
    @client = client 
    end 

    def call 
    uri = URI('http://www.example.com/user.cgi') 
    req = Net::HTTP::Post.new(uri) 
    # see http://apidock.com/rails/ActiveRecord/Serialization/to_xml for options. 
    req.body = @user.to_xml 

    res = Net::HTTP.start(uri.hostname, uri.port) do |http| 
     http.request(req) 
    end 

    case res 
    when Net::HTTPSuccess, Net::HTTPRedirection 
     true 
    else 
     false 
    end 
    end 
end 

然後,我們可以使用我們的服務troller:

def UsersController < ApplicationController 
    # POST `/users` 
    def create 
    @user = User.new(user_params) 
    @posted = UserPostingService.new(@user).call 
    if @posted 
     # ... 
    else 
     # ... 
    end 
    end 
    # ... 
end 

有沒有包括爲簡潔幾個步驟:

  • 你需要的,如果你想發佈使用Ajax,你需要安裝一個形式創造users#create
  • 路線JavaScript中的處理程序。您還應該設置控制器以使用JSON進行響應。
  • 您可能需要根據外部API設置內容類型和其他標頭。
  • 您可能需要驗證對外部API的請求。

這兩個都是非常基本的Rails技能,如果你不知道如何完成它,你應該在嘗試更高級的任務之前按照教程或者讀一本書。

+0

使用服務對象並非絕對必要,但它在測試和代碼組織方面具有巨大的優勢。 https://blog.engineyard.com/2014/keeping-your-rails-controllers-dry-with-services – max