1

簡単な要約: 私は、個人的なチェックリスト/やることリストである Rails アプリを持っています。基本的に、ログインしてToDoリストを管理できます。

私の質問: ユーザーが新しいアカウントを作成するときに、チェックリストに 20 ~ 30 の既定の To Do 項目を入力したいと考えています。私は言うことができることを知っています:

wash_the_car = ChecklistItem.new
wash_the_car.name = 'Wash and wax the Ford F650.'
wash_the_car.user = @new_user
wash_the_car.save!

...repeat 20 times...

ただし、入力する ChecklistItem 行が 20 行あるため、60 行の非常に湿った (DRY ではない) コードになります。もっと良い方法があるはずです。

そのため、アカウントの作成時に YAML ファイルから ChecklistItems テーブルをシードしたいと考えています。YAML ファイルには、入力するすべての ChecklistItem オブジェクトを含めることができます。新しいユーザーが作成されたとき -- bam! -- 事前設定された To Do 項目がリストにあります。

どうすればいいですか?

ありがとう!

(追伸: なぜ私がこれを行っているのか疑問に思っている方のために: 私は Web デザイン会社のクライアント ログインを作成しています。20 の一連のステップ (最初の会議、設計、検証、テストなど) を実行します。これらの 20 のステップは、新しいクライアントごとに入力したい 20 のチェックリスト項目です. ただし、誰もが同じ 20 の項目から始めますが、通常、プロジェクトに基づいて実行するステップをカスタマイズします (したがって、私のバニラのやることリストの実装と、プログラムで行を入力したいという願望)質問があれば、さらに説明できます.

4

3 に答える 3

3

関数を書くだけです:

def add_data(data, user)
wash_the_car = ChecklistItem.new
wash_the_car.name = data
wash_the_car.user = user
wash_the_car.save!
end

add_data('Wash and wax the Ford F650.', @user)
于 2009-05-11T11:12:26.887 に答える
1

私はあなたがコードでそれをすることを提案している他の回答者に同意します。しかし、提案されているほど冗長である必要はありません。あなたがそれをしたいのであれば、それはすでにワンライナーです:

@new_user.checklist_items.create! :name => 'Wash and wax the Ford F650.'

ファイルから読み取ったり、クラスに保存したりするアイテムのループにそれをスローします。

class ChecklistItem < AR::Base
  DEFAULTS = ['do one thing', 'do another']
  ...
end

class User < AR::Base
  after_create :create_default_checklist_items

  protected
  def create_default_checklist_items
    ChecklistItem::DEFAULTS.each do |x|
      @new_user.checklist_items.create! :name => x
    end
  end
end

または、アイテムの複雑さが増す場合は、文字列の配列をハッシュの配列に置き換えます...

# ChecklistItem...
DEFAULTS = [
  { :name => 'do one thing', :other_thing => 'asdf' },
  { :name => 'do another', :other_thing => 'jkl' },
]

# User.rb in after_create hook:    
ChecklistItem::DEFAULTS.each do |x|
  @new_user.checklist_items.create! x
end

ただし、すべてのデフォルトを内部の定数にスローすることを実際に提案しているわけではありませんChecklistItem。Rubyオブジェクトの構造を確認できるように、そのように説明しました。代わりに、一度読み込んでキャッシュしたYAMLファイルにそれらをスローします。

class ChecklistItem < AR::Base
  def self.defaults
    @@defaults ||= YAML.read ...
  end
end

または、管理者がデフォルトオプションをその場で管理できるようにしたい場合は、それらをデータベースに配置します。

class ChecklistItem < AR::Base
  named_scope :defaults, :conditions => { :is_default => true }
end

# User.rb in after_create hook:    
ChecklistItem.defaults.each do |x|
  @new_user.checklist_items.create! :name => x.name
end

たくさんのオプション。

于 2009-05-12T15:08:52.823 に答える
1

Rails Fixture を使用して、ユニット テストのテスト データを入力します。あなたが言及したシナリオで使用することを意図しているとは思わないでください。

新しいメソッドを抽出するだけで、それで完了だと思いますadd_checklist_item

def on_user_create
  add_checklist_item 'Wash and wax the Ford F650.', @user
  # 19 more invocations to go
end

より柔軟性が必要な場合

def on_user_create( new_user_template_filename )
  #read each line from file and call add_checklist_item
end

このファイルは、各行が「フォード F650 のウォッシュとワックス」のようなタスクの説明に対応する単純なテキスト ファイルにすることができます。Rubyで書くのはかなり簡単なはずですが、

于 2009-05-11T11:09:15.037 に答える