在JSON / XML [RoR]中渲染非activerecord对象

时间:2014-11-07 17:18:08

标签: ruby-on-rails ruby json activerecord

我正在使用ruby gem whois测试一个小的whois API,并且由于whois响应的格式非常有趣,有时我被要求不使用ActiveRecord来保存响应。

简单地说,这里是如何运作的:

  1. 用户在视图中输入表单中的域名(操作'查找' =创建请求)
  2. Controller捕获参数然后通过实例化请求对象[包含whois响应]发送到模型(非activerecord)
  3. Model使用whois gem并将回复发送回控制器
  4. Controller以不同的格式(html / json / xml)发送响应,但只有html才能获取该对象。
  5. 以下是操作的代码" lookup"我的控制器"请求" :

    def lookup
    domain = params[:domain]
    @request = Request.new.search(domain)
    
    respond_to do |format|
      if @request != nil
        format.html
        format.json { render :json => @request}
        format.xml {render :xml => @request}
      else
        format.html { render :new }
        format.json { render json: @request.errors, status: :unprocessable_entity }
      end
    end
    

    显然,我很难过,因为我没有使用ActiveRecord,而且由于RoR期待的是他一直在吐出nilClass异常。

    所以当我继续localhost:8080/requests/lookup时,一切都显示得很好,而@request包含了我想要的所有数据。 但是,localhost:8080/requests/lookup.jsonlocalhost:8080/requests/lookup.xml没有任何显示,如果我尝试在构建器(Jbuilder / XMLBuilder)中给出指令,它会抛出一个nilClass异常,证明变量范围不是全局的。

    不,我不认为加入变量会话是一个好主意:我只会将它用于单个查询。

    如果需要,我很乐意提供更多代码,如果它可以帮助您理解我的问题。我知道AR是要走的路,但我很好奇,知道如何绕过这种情况,比如这个。

    谢谢!

1 个答案:

答案 0 :(得分:0)

即使您没有使用ActiveRecord,也可以使用ActiveModel。 Rails 4让它变得非常简单。您还可以添加ActiveModel::Serialization,以便使用.to_json.to_xml

序列化对象
class WhoisLookup
  include ActiveModel::Model
  include ActiveModel::Serializers::JSON
  include ActiveModel::Serializers::Xml

  attr_accessor :search_term # ...

  # you can use all the ActiveModel goodies
  validates :search_term, presence: true, length: {in:2..255}
end

ActiveModel :: Serialization将允许您使用:

format.json { render :json => @result } # calls @result.to_json

PS。不要使用@request进行变量命名(可能是@result?),你必然会遇到问题并与ActionDispatch::Request混淆。