Ruby on rails Rails中嵌套资源的更新操作
我的routes.rb中有一个嵌套资源Ruby on rails Rails中嵌套资源的更新操作,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,Rails Activerecord,我的routes.rb中有一个嵌套资源 # routes.rb resources :users do resource :preferences, :only => [:create,:show,:update,:destroy] end 现在要更新用户的首选项,我使用 preferences = Preference.where(:user_id => user_id).update_all(preferences_request) render json: prefere
# routes.rb
resources :users do
resource :preferences, :only => [:create,:show,:update,:destroy]
end
现在要更新用户的首选项,我使用
preferences = Preference.where(:user_id => user_id).update_all(preferences_request)
render json: preferences, status: 200
但是我觉得使用update\u all
不是一个好的做法,因为每个用户只有一个偏好。而且我不能使用render:json=>preferences
,因为preferences
将具有值1
,而不是具有所有表属性的实际哈希对象。
更新首选项的最佳方法是什么?只需加载首选项,然后执行一次
您必须处理查询返回nil的情况(例如,因为用户不存在)<代码>首选项\u请求必须是
属性=>值的散列
。当然,您可能还需要验证它和/或使用“强参数”功能过滤您不想更新的属性。您似乎有用户1-1偏好,代码如下:
class User < ActiveRecord::Base
has_one :preference
end
class Preference < ActiveRecord::Base
belongs_to :user
end
通常,对于这种请求,您会提出两个查询。一个用于查找
用户
,另一个用于更新它
您的请求应发送到URL用户/1/首选项
(将1替换为您尝试更新的用户id)
然后控制器代码可以如下所示
def update
user = User.find(params[:user_id])
user.preferences.update!(preference_request)
render json: user.preferences
end
这样做的好处是,如果用户不存在,它将适当地抛出404错误,如果由于某种原因更新失败,它将抛出带有验证错误的500错误
阅读有关HTTP状态码及其如何帮助您的首选项。where(user\u id:user\u id)。take可替换为首选项。find\u by!(user\u id:user\u id)为简洁起见。:-)有道理,我更新了答案@Drenmi。谢谢
class PreferencesController
def update
preference = User.find(params[:id]).preference
preference.update(params[:preference])
return json: preference.as_json
end
end
def update
user = User.find(params[:user_id])
user.preferences.update!(preference_request)
render json: user.preferences
end