我正在使用ruby gem whois测试一个小的whois api,由于whois响应的格式非常有趣,有时我被要求不要使用activerecord来保存响应。
简单地说,它的工作原理如下:
用户从视图在表单中输入域名(操作“lookup”=创建请求)
控制器捕获参数,然后通过实例化请求对象[包含whois响应]将其发送到模型(非活动记录)
模型使用whois gem并将whois响应发送回控制器
控制器以不同的格式(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希望使用它,所以他一直在抛出nilclass异常。
所以当我继续
localhost:8080/requests/lookup
时,一切都显示得很好,@request包含了我想要的所有数据。但是无论是
localhost:8080/requests/lookup.json
还是localhost:8080/requests/lookup.xml
都没有显示,如果我尝试在生成器(jbuilder/xmlbuilder)中给出指令,它就会抛出nilclass异常,证明变量作用域不是全局的……不,我不认为放入变量会话是一个好主意:我只将它用于单个查询。
如果需要,我很乐意提供更多的代码,如果它可以帮助您理解我的问题。我知道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::序列化将允许您使用:
format.json { render :json => @result } # calls @result.to_json
注意:不要使用
@request
来命名变量(@result may?)您一定会遇到ActionDispatch::Request
的问题和困惑。关于ruby-on-rails - 呈现JSON/XML [RoR]中的非activerecord对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26806564/