ActiveResource发布而不是通过应用程序,而不是命令行

时间:2012-02-06 01:27:25

标签: ruby-on-rails ruby-on-rails-3 activerecord activeresource

我有一个基于ActiveResource的应用程序(称为客户端),它与API应用程序(称为api)连接。

我有一个模型实例,我通过表单更新实例,使用这样一个简单的控制器将表单放到客户端:

def update
  @current_user.update_attributes(:psset => params[:permissions])
end

而不是去api上的更新控制器,更新控制器POSTS到api上的创建控制器,而不是更新,即触发POST到/用户而不是PUT到/ users /:id。表单始终转到此控制器,因此表单会正确发布到客户端。

最令人抓狂的部分是运行命令

@current_user.update_attributes(:psset => params[:permissions])
从具有相同资源的相同环境的pry中的

将PUT转换为api上的/ users /:id。

因此,在调用update_attributes时,该更新控制器中的某些内容正在尝试注册新资源并在api上创建。

我对于为什么我无法从控制器进行更新而感到困惑,但可以从命令行实例进行更新。这是第一个在这种情况下,使用这个控制器,所以我必须在某些时候做一些触发新资源的事情,但是无法弄清楚是什么。像往常一样,我会尝试根据问题填写更具体的代码。我知道我可能只是缺少一些愚蠢的东西,但是什么?

编辑:请求相关路线

API:

   resources :users do       #, :only => [:index, :show, :create, :destroy]
    collection do
    end
   end

客户端:

   resources :user, :only => [ :show, :update, :destroy ]

我意识到早些时候我在路由中的用户/用户和客户端的控制器之间做了一些区分,看着我不确定是最有效的方法,现在嗯,但它直到现在。如果有更好的方法在路线(用户/用户)中进行区分而没有我想要的单独控制器,那么这只是我注意到的一种用户安全的持久性特征。

在调整了周围的路线之后,问题仍然存在。我正确地发布到客户端路由,该客户端路由去创建一个新资源,而不是更新现有资源(即使它使用它将用于更新的参数)。

UGH,找到了答案。我开始在这个客户端上使用cached_resource gem,最近我为所有模型启用了它。关闭用户模型,问题消失了。将缓存解决方案再次推向未来。

1 个答案:

答案 0 :(得分:0)

activeresource update_attributes的逻辑是下一个

  

文件activeresource / lib / active_resource / base.rb,第1306行

def update_attributes(attributes)
  load(attributes, false) && save
end
# File activeresource/lib/active_resource/base.rb, line 1147
    def save
      new? ? create : update
    end

所以它可以发布或放置取决于新的结果?方法 这是方法(它取决于持久化)

文件activeresource / lib / active_resource / base.rb,第1047行

def new?
  !persisted?
end

解释在这里 http://api.rubyonrails.org/classes/ActiveResource/Base.html#method-i-persisted-3F