Rails 4+以一种形式编辑多个对象BEST PRACTICE

时间:2016-02-20 11:08:51

标签: ruby-on-rails ruby-on-rails-3 nested-form-for

我有一个用户,饮料,健身房,食物模型。

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
    


所以我的问题是:在这种情况下最好的做法是什么?

1 个答案:

答案 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