15

カスタム FormBuilder を使用していくつかのカスタム フィールド タグを提供するフォームを Rails アプリに作成しました。

<% form_for :staff_member, @staff_member, :builder => MyFormBuilder do |f| %>
[...]
    <%= render :partial => "staff_members/forms/personal_details", :locals => {:f => f, :skill_groups => @skill_groups, :staff_member => @staff_member} %>  
[...]
<% end %>

現在、このパーシャルは、AJAX コールバックによって置き換えられるフォームの領域にあります。AJAX リクエストに応答してコントローラから行うことは次のとおりです。

render :partial => "staff_members/forms/personal_details", :locals => {:skill_groups => @skill_groups, :staff_member => @staff_member}

ただし、これを行うと、form_for で使用した FormBuilder オブジェクトが使用できなくなるため、フォームが壊れます。AJAX コールバックに使用されるパーシャル内でカスタム FormBuilder オブジェクトを使用する方法はありますか?

4

5 に答える 5

15

fields_forパーシャル内で使用します。同様のタスクを実行しますが、フォーム タグをラップしません。API ドキュメントを参照してください。

于 2009-01-02T12:43:46.967 に答える
2

これはどう?

  @template.with_output_buffer do
    @template.form_for @model_object do |f|
      f.fields_for :some_nested_attributes do |ff|
        render :partial => 'nested_attributes', :object => @model_object, :locals => {:form => ff}
      end
    end
  end

これは、部分的にネストされた fields_for を使用する必要がある場合に特に役立ちます

于 2010-10-18T22:56:03.500 に答える
1

たぶん私はここでゲームに少し遅れており、質問を正しく理解していないかもしれませんが、ApplicationHelper.rbでは次の行を追加するだけでよいと思います。

ActionView::Base.default_form_builder = MyFormBuilder
于 2010-10-22T14:51:48.673 に答える
1

コントローラーでフォームビルダーの新しいインスタンスをインスタンス化することもできますが、私には少しお粗末に感じます:

# in the controller
render :partial => {
  :f => MyFormBuilder.new(:staff_member, @staff_member, template),
  :skill_groups => @skill_groups,
  :staff_member => @staff_member
}

または、更新ロジックの多くをクライアント側に移動して、何もレンダリングすることを心配する必要がないようにすることもできます。JS を介して値を更新するだけです。ただし、それがプロジェクトで機能するかどうかはわかりません。

于 2009-01-01T20:31:08.173 に答える