我正在使用ruby gem whois测试一个小的whois API,并且由于whois响应的格式非常有趣,有时我被要求不使用ActiveRecord来保存响应。
简单地说,这里是如何运作的:
以下是操作的代码" 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.json
或localhost:8080/requests/lookup.xml
没有任何显示,如果我尝试在构建器(Jbuilder / XMLBuilder)中给出指令,它会抛出一个nilClass异常,证明变量范围不是全局的。
不,我不认为加入变量会话是一个好主意:我只会将它用于单个查询。
如果需要,我很乐意提供更多代码,如果它可以帮助您理解我的问题。我知道AR是要走的路,但我很好奇,知道如何绕过这种情况,比如这个。
谢谢!
答案 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
混淆。