Rails:为has_many关系创建默认记录

时间:2012-04-21 03:41:06

标签: ruby-on-rails-3 ruby-on-rails-3.2

我有一个预算计划员的rails 3.2应用程序。

我的模型以用户为特色,用户只有一个预算,每个预算都有许多预算项目。创建用户后,将为其创建预算。

当用户访问预算时,如果没有,我会插入空白的budget_item。但是,我想要做的是使用一组带有估算成本的默认预算项目预先填充每个预算。这可以在创建预算时完成,也可以在用户访问空白预算时完成。

我想尽可能干净一个实现,因为我正在尝试在Rails中做“正确的方式”(如果你看到任何不寻常的代码,还没有完全实现):

我的代码可以在这里看到:https://github.com/michaelward82/WeddingPlanner

好吧虽然答案会比快速答案更好。在给出正确答案之前,我会给出合理的时间。


编辑:

我已经成功地通过以下方式更改我的BudgetsController来实现默认记录的创建:

class BudgetsController < ApplicationController
  def show
    if current_user
      @budget = current_user.budget
      if @budget.budget_items.empty?
        set_default_budget_items @budget
      end
    else
      redirect_to log_in_path
    end
  end

  def update
    @budget = current_user.budget
    if @budget.update_attributes(params[:budget])
      redirect_to budget_path, :flash => { :success => "Budget changes saved" }
    else
      redirect_to budget_path, :flash => { :error => "Budget changes were not saved" }
    end
  end

  private

  def set_default_budget_items(budget)
    default_budget_items = [
      { "description"=>"Insurance", "estimated_cost"=>"110", "actual_cost"=>"0", "position"=>"1"},
      { "description"=>"The Service", "estimated_cost"=>"520", "actual_cost"=>"0", "position"=>"2"},
      { "description"=>"Reception (venue, food & drinks)", "estimated_cost"=>"4000",  "actual_cost"=>"0", "position"=>"3"}
    ]

    default_budget_items.each {|b| @budget.budget_items.new(b) }
  end
end

这是最好的方法吗?我很高兴能够这样做,但如果有更清洁的方式来组织这个,那么我很高兴知道。默认项目比上面看到的多得多,所以我怀疑我的控制器是这个数据存在的地方。

1 个答案:

答案 0 :(得分:3)

我认为你正在制造一个沉重的控制器,这可能应该转移到模型中。你想尽可能保持你的控制器瘦。这个谷歌'rails瘦控制器'上有很多文章。

http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

我会使用回调(可能是after_create),具体取决于你为应用程序的其余部分准备的内容。