Ruby on rails Rails中嵌套资源的更新操作

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中有一个嵌套资源

# 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