-
Notifications
You must be signed in to change notification settings - Fork 21.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Override default form builder for a controller
- Loading branch information
1 parent
efaec3d
commit dbfe67e
Showing
9 changed files
with
124 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
module ActionController | ||
# Override the default form builder for all views rendered by this | ||
# controller and any of its descendents. Accepts a sublcass of | ||
# +ActionView::Helpers::FormBuilder+. | ||
# | ||
# For example, given a form builder: | ||
# | ||
# class AdminFormBuilder < ActionView::Helpers::FormBuilder | ||
# def special_field(name) | ||
# end | ||
# end | ||
# | ||
# The controller specifies a form builder as its default: | ||
# | ||
# class AdminAreaController < ApplicationController | ||
# default_form_builder AdminFormBuilder | ||
# end | ||
# | ||
# Then in the view any form using +form_for+ will be an instance of the | ||
# specified form builder: | ||
# | ||
# <%= form_for(@instance) do |builder| %> | ||
# <%= builder.special_field(:name) %> | ||
# <%= end %> | ||
module FormBuilder | ||
extend ActiveSupport::Concern | ||
|
||
included do | ||
class_attribute :_default_form_builder, instance_accessor: false | ||
end | ||
|
||
module ClassMethods | ||
# Set the form builder to be used as the default for all forms | ||
# in the views rendered by this controller and its subclasses. | ||
# | ||
# ==== Parameters | ||
# * <tt>builder</tt> - Default form builder, an instance of +ActionView::Helpers::FormBuilder+ | ||
def default_form_builder(builder) | ||
self._default_form_builder = builder | ||
end | ||
end | ||
|
||
# Default form builder for the controller | ||
def default_form_builder | ||
self.class._default_form_builder | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
require 'abstract_unit' | ||
|
||
class FormBuilderController < ActionController::Base | ||
class SpecializedFormBuilder < ActionView::Helpers::FormBuilder ; end | ||
|
||
default_form_builder SpecializedFormBuilder | ||
end | ||
|
||
class ControllerFormBuilderTest < ActiveSupport::TestCase | ||
setup do | ||
@controller = FormBuilderController.new | ||
end | ||
|
||
def test_default_form_builder_assigned | ||
assert_equal FormBuilderController::SpecializedFormBuilder, @controller.default_form_builder | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
require 'abstract_unit' | ||
|
||
class ControllerHelperTest < ActionView::TestCase | ||
tests ActionView::Helpers::ControllerHelper | ||
|
||
class SpecializedFormBuilder < ActionView::Helpers::FormBuilder ; end | ||
|
||
def test_assign_controller_sets_default_form_builder | ||
@controller = OpenStruct.new(default_form_builder: SpecializedFormBuilder) | ||
assign_controller(@controller) | ||
|
||
assert_equal SpecializedFormBuilder, self.default_form_builder | ||
end | ||
|
||
def test_assign_controller_skips_default_form_builder | ||
@controller = OpenStruct.new | ||
assign_controller(@controller) | ||
|
||
assert_nil self.default_form_builder | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters