我有一个基于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,最近我为所有模型启用了它。关闭用户模型,问题消失了。将缓存解决方案再次推向未来。答案 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
所以它可以发布或放置取决于新的结果?方法 这是方法(它取决于持久化)
def new?
!persisted?
end
解释在这里 http://api.rubyonrails.org/classes/ActiveResource/Base.html#method-i-persisted-3F