在JSON / XML中渲染非activerecord对象

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

简单地说,这是它的工作原理:

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

这是我的控制器“请求”的动作“查找”的代码:

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正在期待一个,他不断吐出nilClassexception。

所以当我继续使用localhost:8080/requests/lookup一切都显示正常,而@request包含我想要的所有数据。 但是localhost:8080/requests/lookup.jsonlocalhost:8080/requests/lookup.xml没有显示,如果我尝试在构建器(Jbuilder / XMLBuilder)中给出指令,它会抛出一个nilClassexception,certificate变量范围不是这么全球……

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

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

谢谢 !

即使您没有使用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混淆的问题。