从客户端Ruby脚本发送信息到Rails应用程序的最佳方式?

时间:2010-11-25 07:16:02

标签: ruby-on-rails ruby api

我想通过从客户端Ruby脚本发送跟踪数据信息,在Rails应用程序中的Track(如音乐)数据库中创建条目。我只需要创建和销毁来自脚本的曲目,我不需要任何Web界面,而且我现在不担心身份验证/授权。 有人可以告诉我(a)如何正确设置Rails应用程序(使用Rails 2.3.8)和(b)如何从Ruby脚本发送数据?

这是我到目前为止采用的方法:

我创建了一个Track模型和Tracks控制器。这是Track控制器代码:

class TracksController < ApplicationController

  def create
    @track = Track.new(params[:track])
    respond_to do |format|  
      if track.save
        format.any(:xml, :json) { head :ok }
      else
        format.xml { render :xml => @track.errors, :status => :unprocessable_entity}
        format.json { render :json => @track.errors, :status => :unprocessable_entity}
      end
    end
  end

  def destroy
    @track = Track.find(params[:id])  
    @track.destroy
    respond_to do |format|
      format.any(:xml, :json) { head :ok }
    end
  end    

end

我已按如下方式设置路线:

  map.resources :tracks, :only => [:create, :destroy]

为了从Ruby脚本发送信息,我尝试了(1)使用ActiveResource和(2)使用net / http和xml格式的轨道信息。对于后者,我不知道如何用net / http发布帖子请求,而且我不清楚如何正确格式化xml。例如,我可以在轨道对象上使用to_xml吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我没有看到您的API有任何特殊问题,或者您是如何使用HTTP客户端编写脚本的。但是,为了使其适合RESTful标准,您的create调用应该将对象作为XML或JSON返回。实际上,您只需在@track对象上调用to_xmlto_json即可。这些函数接受进一步控制输出的选项。例如,如果您希望从API中排除某些数据,则可以传递:except选项。有关详细信息,请参阅相关文档。

至于你的脚本,我个人更喜欢HTTParty而非ActiveResource - 非常简单,易于理解,并且不要求你完全符合ActiveResource的服务方式。 The examples是一个很好的起点,或者查看Chargify gem以查看更长的示例。 HTTParty只需要一个Hash并将其转换为XML或JSON。您不需要在脚本中拥有Track对象(除非您真的想要)。你的脚本会是这样的:

require 'httparty'

class TrackPoster
  include HTTParty
  base_uri 'http://hostname.com'

  def self.create_track(artist, song)
    post('/tracks', :body => { 
      :track => { :artist => artist, :song => song }})
  end
end

TrackPoster.create_track('The Beatles', 'Let It Be')

此调用将返回解析后的XML / JSON作为哈希值。