我有一个用户,饮料,健身房,食物模型。
class User < ActiveRecord::Base
has_many :drinks
has_many :foods
has_many :gyms
end
我跟踪用户在白天饮用的饮料数量并将其保存在数据库中。我对食品和健身房做同样的事情。
我有一个用户和一个会话(用于登录)控制器。到目前为止,我还没有为我的“passiv”模特(饮料,食物,健身房)使用控制器。
现在我有一个页面,上面有一个表格,用户可以在其中更改前一天所有表格(饮料,食物,健身房)的条目。
我认为我需要在表单中使用fields_for来编辑一个表单中多个模型的对象。
然而,我不知道我需要多少个控制器以及我应该放在所有业务逻辑中...我不想做任何快速和肮脏的事情,而是遵循某些最佳实践。
到目前为止我的方法:
一页上有很多表格
<%= form_for :running, url: data_update_user_path do |f| %>
<%= form_for :drinks, url: data_update_user_path do |f| %>
<%= form_for :food, url: data_update_user_path do |f|
一个处理所有不同更新的DataController(它基本上是一个很大的if ifs)
class DataController
def update
if params[:drinks]
#update drinks
elsif params[:foods]
#update foods
elsif params[:gyms]
#update gyms
end
end
end
所以我的问题是:在这种情况下最好的做法是什么?
答案 0 :(得分:2)
使用只有一个控制器的嵌套表单;用户控制器,当您使用accepts_nested_attributes_for
时,用户的更新操作也会更新它的相关模型,所以基本上您的用户模型将是
class User < ActiveRecord::Base
has_many :foods
has_many :drinks
has_many :gyms
accepts_nested_attributes_for :foods, :drinks, :gyms
end
for for for用户将包含fields_for
食物,饮料和健身房
如果您使用strong_parameters来允许嵌套模型的属性,请不要忘记在您的用户控制器中
def user_params
params.require(:user).permit(:id, .... , foods_attributes: [:id, :destroy, ....], gyms_attributes: [:id, :_destroy, ....], drinks_attributes: [:id, :_destroy, ....])
end