Skip to content

Commit

Permalink
Merge pull request #5625 from nertzy/prefix_partial_path_with_control…
Browse files Browse the repository at this point in the history
…ler_namespace

Add config option to turn off prefixing partial path with controller namespace
  • Loading branch information
josevalim committed Mar 29, 2012
2 parents e83e76e + 18d275a commit e51322a
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 15 deletions.
6 changes: 6 additions & 0 deletions actionpack/lib/action_view/base.rb
Expand Up @@ -141,6 +141,12 @@ class Base
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
Expand Down
13 changes: 10 additions & 3 deletions actionpack/lib/action_view/renderer/partial_renderer.rb
Expand Up @@ -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)
Expand Down Expand Up @@ -423,7 +422,15 @@ def partial_path(object = @object)
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)
Expand Down
Expand Up @@ -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


Expand All @@ -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
2 changes: 1 addition & 1 deletion actionpack/test/fixtures/fun/games/_game.erb
@@ -1 +1 @@
<%= game.name %> Fun <%= game.name %>
2 changes: 1 addition & 1 deletion actionpack/test/fixtures/fun/serious/games/_game.erb
@@ -1 +1 @@
<%= game.name %> Serious <%= game.name %>
1 change: 1 addition & 0 deletions actionpack/test/fixtures/games/_game.erb
@@ -0,0 +1 @@
Just <%= game.name %>
11 changes: 9 additions & 2 deletions guides/source/configuring.textile
Expand Up @@ -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


Expand Down Expand Up @@ -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+:
Expand Down

0 comments on commit e51322a

Please sign in to comment.