在JSON / XML中渲染非activerecord对象
我正在使用ruby gem whois测试一个小的whois API,并且由于whois响应的格式非常有趣,有时我被要求不使用ActiveRecord来保存响应。
简单地说,这是它的工作原理:
- 用户从视图中输入表单中的域名(操作’lookup’=创建请求)
- 控制器捕获参数然后通过实例化请求对象[包含whois响应]发送到模型(非activerecord)
- Model使用whois gem并将回复发送回控制器
- 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.json
或localhost: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
混淆的问题。