2

我有一个用于预算规划师的 rails 3.2 应用程序。

我的模型有一个用户,一个用户有一个预算,每个预算有很多budget_items。创建用户时,会为他们创建预算。

当用户访问他们的预算时,如果他们没有,我会插入一个空白的 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

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

4

1 回答 1

3

我认为您正在制作一个重型控制器,这可能应该移至模型中。您希望尽可能使您的控制器保持苗条。关于这个谷歌“rails skinny controllers”的文章很多。

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

我会使用回调(可能是 after_create),具体取决于您对应用程序其余部分的计划。

于 2012-04-23T11:49:36.553 回答