5

Rails に 3 レベルの複数ネストされたフォームがあります。プロジェクトには多くのマイルストーンがあり、マイルストーンには多くのメモがあります。目標は、JavaScript を使用してページ内ですべてを編集可能にすることです。これにより、ページ内のプロジェクトに複数の新しいマイルストーンを追加したり、新規および既存のマイルストーンに新しいメモを追加したりできます。

新しいメモを既存のマイルストーンに追加する場合 (新しいマイルストーンは、メモを追加するときに正常に機能します) を除いて、すべてが期待どおりに機能します。実際にマイルストーンに属するフィールドを編集してマークを付けない限り、新しいメモは保存されません。 「汚れた」/編集されたフォーム。

追加された新しいメモが保存されるように、マイルストーンにフラグを立てる方法はありますか?

編集:申し訳ありませんが、非常に多くの部分があるため、すべてのコードを貼り付けるのは困難ですが、次のとおりです。

モデル

class Project < ActiveRecord::Base
  has_many :notes, :dependent => :destroy
  has_many :milestones, :dependent => :destroy

  accepts_nested_attributes_for :milestones, :allow_destroy => true
  accepts_nested_attributes_for :notes, :allow_destroy => true, :reject_if => proc { |attributes| attributes['content'].blank? }
end

class Milestone < ActiveRecord::Base
  belongs_to :project
  has_many :notes, :dependent => :destroy

  accepts_nested_attributes_for :notes, :allow_destroy => true, :allow_destroy => true, :reject_if => proc { |attributes| attributes['content'].blank? }
end

class Note < ActiveRecord::Base
  belongs_to :milestone
  belongs_to :project

  scope :newest, lambda { |*args| order('created_at DESC').limit(*args.first || 3) }
end

これを実現するために、Ryan Bates のコンボ ヘルパー/JS コードの控えめなバージョンの jQuery ベースを使用しています。

アプリケーション ヘルパー

def add_fields_for_association(f, association, partial)
  new_object = f.object.class.reflect_on_association(association).klass.new
  fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
    render(partial, :f => builder)
  end
end

非表示の div で関連付けのフォームをレンダリングし、次の JavaScript を使用してそれを見つけ、必要に応じて追加します。

JavaScript

function addFields(link, association, content, func) {
    var newID = new Date().getTime();
    var regexp = new RegExp("new_" + association, "g");
    var form = content.replace(regexp, newID);
    var link = $(link).parent().next().before(form).prev();
    if (func) {
        func.call();
    }
    return link;
}

私が考えることができる唯一の他の関連するコードは、NotesController の create メソッドになると思います。

def create
  respond_with(@note = @owner.notes.create(params[:note])) do |format|
    format.js   { render :json => @owner.notes.newest(3).all.to_json }
    format.html { redirect_to((@milestone ? [@project, @milestone, @note] : [@project, @note]), :notice => 'Note was successfully created.') }
  end
end

@owner ivar は、次の before フィルターで作成されます。

def load_milestone
  @milestone = @project.milestones.find(params[:milestone_id]) if params[:milestone_id]
end

def determine_owner
  @owner = load_milestone || @project
end

問題は、既存のマイルストーンに新しいメモを追加する場合を除いて、これはすべて正常に機能しているように見えるということです。新しいメモを保存するには、マイルストーンを「タッチ」する必要があります。そうしないと、Rails は注意を払いません。

4

2 に答える 2

2

これはRails2.3.5のバグ#4242であり、Rails2.3.8で修正されています。

于 2010-06-25T21:27:53.147 に答える