1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Merge pull request #5625 from nertzy/prefix_partial_path_with_controller_namespace

Add config option to turn off prefixing partial path with controller namespace
This commit is contained in:
José Valim 2012-03-28 23:51:34 -07:00
commit e51322a34b
7 changed files with 88 additions and 15 deletions

View file

@ -141,6 +141,12 @@ module ActionView #:nodoc:
cattr_accessor :streaming_completion_on_exception cattr_accessor :streaming_completion_on_exception
@@streaming_completion_on_exception = %("><script type="text/javascript">window.location = "/500.html"</script></html>) @@streaming_completion_on_exception = %("><script type="text/javascript">window.location = "/500.html"</script></html>)
# Specify whether rendering within namespaced controllers should prefix
# the partial paths for ActiveModel objects with the namespace.
# (e.g., an Admin::PostsController would render @post using /admin/posts/_post.erb)
cattr_accessor :prefix_partial_path_with_controller_namespace
@@prefix_partial_path_with_controller_namespace = true
class_attribute :helpers class_attribute :helpers
class_attribute :_routes class_attribute :_routes
class_attribute :logger class_attribute :logger

View file

@ -245,12 +245,11 @@ module ActionView
# <%- end -%> # <%- end -%>
# <% end %> # <% end %>
class PartialRenderer < AbstractRenderer class PartialRenderer < AbstractRenderer
PARTIAL_NAMES = Hash.new { |h,k| h[k] = {} } PREFIXED_PARTIAL_NAMES = Hash.new { |h,k| h[k] = {} }
def initialize(*) def initialize(*)
super super
@context_prefix = @lookup_context.prefixes.first @context_prefix = @lookup_context.prefixes.first
@partial_names = PARTIAL_NAMES[@context_prefix]
end end
def render(context, options, block) def render(context, options, block)
@ -423,7 +422,15 @@ module ActionView
raise ArgumentError.new("'#{object.inspect}' is not an ActiveModel-compatible object. It must implement :to_partial_path.") raise ArgumentError.new("'#{object.inspect}' is not an ActiveModel-compatible object. It must implement :to_partial_path.")
end end
@partial_names[path] ||= merge_prefix_into_object_path(@context_prefix, path.dup) if @view.prefix_partial_path_with_controller_namespace
prefixed_partial_names[path] ||= merge_prefix_into_object_path(@context_prefix, path.dup)
else
path
end
end
def prefixed_partial_names
@prefixed_partial_names ||= PREFIXED_PARTIAL_NAMES[@context_prefix]
end end
def merge_prefix_into_object_path(prefix, object_path) def merge_prefix_into_object_path(prefix, object_path)

View file

@ -130,14 +130,40 @@ class RenderPartialWithRecordIdentificationAndNestedControllersTest < ActiveReco
def test_render_with_record_in_nested_controller def test_render_with_record_in_nested_controller
get :render_with_record_in_nested_controller get :render_with_record_in_nested_controller
assert_template 'fun/games/_game' assert_template %r{\Afun/games/_game\Z}
assert_equal 'Pong', @response.body assert_equal "Fun Pong\n", @response.body
end end
def test_render_with_record_collection_in_nested_controller def test_render_with_record_collection_in_nested_controller
get :render_with_record_collection_in_nested_controller get :render_with_record_collection_in_nested_controller
assert_template 'fun/games/_game' assert_template %r{\Afun/games/_game\Z}
assert_equal 'PongTank', @response.body assert_equal "Fun Pong\nFun Tank\n", @response.body
end
end
class RenderPartialWithRecordIdentificationAndNestedControllersWithoutPrefixTest < ActiveRecordTestCase
tests Fun::NestedController
def test_render_with_record_in_nested_controller
old_config = ActionView::Base.prefix_partial_path_with_controller_namespace
ActionView::Base.prefix_partial_path_with_controller_namespace = false
get :render_with_record_in_nested_controller
assert_template %r{\Agames/_game\Z}
assert_equal "Just Pong\n", @response.body
ensure
ActionView::Base.prefix_partial_path_with_controller_namespace = old_config
end
def test_render_with_record_collection_in_nested_controller
old_config = ActionView::Base.prefix_partial_path_with_controller_namespace
ActionView::Base.prefix_partial_path_with_controller_namespace = false
get :render_with_record_collection_in_nested_controller
assert_template %r{\Agames/_game\Z}
assert_equal "Just Pong\nJust Tank\n", @response.body
ensure
ActionView::Base.prefix_partial_path_with_controller_namespace = old_config
end end
end end
@ -146,13 +172,39 @@ class RenderPartialWithRecordIdentificationAndNestedDeeperControllersTest < Acti
def test_render_with_record_in_deeper_nested_controller def test_render_with_record_in_deeper_nested_controller
get :render_with_record_in_deeper_nested_controller get :render_with_record_in_deeper_nested_controller
assert_template 'fun/serious/games/_game' assert_template %r{\Afun/serious/games/_game\Z}
assert_equal 'Chess', @response.body assert_equal "Serious Chess\n", @response.body
end end
def test_render_with_record_collection_in_deeper_nested_controller def test_render_with_record_collection_in_deeper_nested_controller
get :render_with_record_collection_in_deeper_nested_controller get :render_with_record_collection_in_deeper_nested_controller
assert_template 'fun/serious/games/_game' assert_template %r{\Afun/serious/games/_game\Z}
assert_equal 'ChessSudokuSolitaire', @response.body assert_equal "Serious Chess\nSerious Sudoku\nSerious Solitaire\n", @response.body
end
end
class RenderPartialWithRecordIdentificationAndNestedDeeperControllersWithoutPrefixTest < ActiveRecordTestCase
tests Fun::Serious::NestedDeeperController
def test_render_with_record_in_deeper_nested_controller
old_config = ActionView::Base.prefix_partial_path_with_controller_namespace
ActionView::Base.prefix_partial_path_with_controller_namespace = false
get :render_with_record_in_deeper_nested_controller
assert_template %r{\Agames/_game\Z}
assert_equal "Just Chess\n", @response.body
ensure
ActionView::Base.prefix_partial_path_with_controller_namespace = old_config
end
def test_render_with_record_collection_in_deeper_nested_controller
old_config = ActionView::Base.prefix_partial_path_with_controller_namespace
ActionView::Base.prefix_partial_path_with_controller_namespace = false
get :render_with_record_collection_in_deeper_nested_controller
assert_template %r{\Agames/_game\Z}
assert_equal "Just Chess\nJust Sudoku\nJust Solitaire\n", @response.body
ensure
ActionView::Base.prefix_partial_path_with_controller_namespace = old_config
end end
end end

View file

@ -1 +1 @@
<%= game.name %> Fun <%= game.name %>

View file

@ -1 +1 @@
<%= game.name %> Serious <%= game.name %>

View file

@ -0,0 +1 @@
Just <%= game.name %>

View file

@ -354,8 +354,7 @@ h4. Configuring Action Dispatch
h4. Configuring Action View h4. Configuring Action View
There are only a few configuration options for Action View, starting with six on +ActionView::Base+: <tt>config.action_view</tt> includes a small number of configuration settings:
* +config.action_view.field_error_proc+ provides an HTML generator for displaying errors that come from Active Record. The default is * +config.action_view.field_error_proc+ provides an HTML generator for displaying errors that come from Active Record. The default is
@ -397,6 +396,14 @@ And can reference in the view with the following code:
* +config.action_view.embed_authenticity_token_in_remote_forms+ allows you to set the default behavior for +authenticity_token+ in forms with +:remote => true+. By default it's set to false, which means that remote forms will not include +authenticity_token+, which is helpful when you're fragment-caching the form. Remote forms get the authenticity from the +meta+ tag, so embedding is unnecessary unless you support browsers without JavaScript. In such case you can either pass +:authenticity_token => true+ as a form option or set this config setting to +true+ * +config.action_view.embed_authenticity_token_in_remote_forms+ allows you to set the default behavior for +authenticity_token+ in forms with +:remote => true+. By default it's set to false, which means that remote forms will not include +authenticity_token+, which is helpful when you're fragment-caching the form. Remote forms get the authenticity from the +meta+ tag, so embedding is unnecessary unless you support browsers without JavaScript. In such case you can either pass +:authenticity_token => true+ as a form option or set this config setting to +true+
* +config.action_view.prefix_partial_path_with_controller_namespace+ determines whether or not partials are looked up from a subdirectory in templates rendered from namespaced controllers. For example, consider a controller named +Admin::PostsController+ which renders this template:
<erb>
<%= render @post %>
<erb>
The default setting is +true+, which uses the partial at +/admin/posts/_post.erb+. Setting the value to +false+ would render +/posts/_post.erb+, which is the same behavior as rendering from a non-namespaced controller such as +PostsController+.
h4. Configuring Action Mailer h4. Configuring Action Mailer
There are a number of settings available on +config.action_mailer+: There are a number of settings available on +config.action_mailer+: