【问题标题】:rails activeresource messagesrails activeresource 消息
【发布时间】:2011-04-01 14:09:19
【问题描述】:

我有一个关于活动资源的简短问题。如果我有一个用户资源,当我打电话时

User.find(1).put(:promote, :position => 'manager')

根据 api,它翻译成这个调用 /users/1/promote.xml?position=manager

我的问题是这样的。 activeresource 实际上在这里打了两个电话吗? find 执行 get,然后放置该对象,或者将 .put 附加到 .find 是否意味着它只进行一次调用。如果是这样,那么 .find 的唯一原因是提供 /users/:id/promote 的正确 url 格式??

我在文档中找不到可能指定此内容的位置,但正是 .find 让我觉得可能发生了两个服务调用?

【问题讨论】:

    标签: ruby-on-rails activeresource


    【解决方案1】:

    如果 ActiveResource 像 ActiveRecord 一样工作,我会说“是”。如果你做类似的事情

    Foo.find(1).update_attributes(:name=>"Bar")
    

    ActiveRecord 首先进行选择以获取对象,然后向数据库发出更新调用以更改记录。我假设 ActiveResources 以类似的方式运行,它发出两个 Web 服务调用以获取对象,然后更新对象。

    【讨论】:

    • 我希望情况并非如此,从服务性能的角度来看,这似乎非常糟糕。由于都是 xml 消息,因此最初的 find 对我没有任何作用,只是调用 User.put(:promote...) 不会返回用户对象,而是返回用户属性的散列......所以 api 推荐使用 User.find(x).put... 我仍然很感兴趣,所以知道是否有人有明确的答案
    • 您可以运行数据包嗅探器,例如WireShark,最终测试一下。
    • 问题是,Rails 需要验证 User.find(1) 确实存在并且不返回 nil,否则它会尝试对不存在的记录执行 put 操作。这让我相信它会进行两次调用,但我同意 @Schrockwell,数据包嗅探器 FTW
    【解决方案2】:

    将以下内容放入您的初始化程序中:

    class ActiveResource::Connection
      #   Creates new Net::HTTP instance for communication with
      #   remote service and resources.
      def http
        http = Net::HTTP.new(@site.host, @site.port)
        http.use_ssl = @site.is_a?(URI::HTTPS)
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl
        http.read_timeout = @timeout if @timeout
        #Here's the addition that allows you to see the output
        http.set_debug_output $stderr
        return http
      end
    end
    

    搜索 '"http.set_debug_output $stderr" "ActiveResource"' 以查找此有用提示的原作者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多