提交 18d275ad 编写于 作者: G Grant Hutchins

Make controller namespace partial prefix optional

config.action_view.prefix_partial_path_with_controller_namespace

This allows you to choose to render @post using
/posts/_post.erb instead of /admin/posts/_post.erb
inside Admin::PostsController.
上级 a0e83d5a
......@@ -141,6 +141,12 @@ class Base
cattr_accessor :streaming_completion_on_exception
@@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 :_routes
class_attribute :logger
......
......@@ -245,12 +245,11 @@ module ActionView
# <%- end -%>
# <% end %>
class PartialRenderer < AbstractRenderer
PARTIAL_NAMES = Hash.new { |h,k| h[k] = {} }
PREFIXED_PARTIAL_NAMES = Hash.new { |h,k| h[k] = {} }
def initialize(*)
super
@context_prefix = @lookup_context.prefixes.first
@partial_names = PARTIAL_NAMES[@context_prefix]
end
def render(context, options, block)
......@@ -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.")
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
def merge_prefix_into_object_path(prefix, object_path)
......
......@@ -131,13 +131,39 @@ class RenderPartialWithRecordIdentificationAndNestedControllersTest < ActiveReco
def test_render_with_record_in_nested_controller
get :render_with_record_in_nested_controller
assert_template %r{\Afun/games/_game\Z}
assert_equal 'Pong', @response.body
assert_equal "Fun Pong\n", @response.body
end
def test_render_with_record_collection_in_nested_controller
get :render_with_record_collection_in_nested_controller
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
......@@ -147,12 +173,38 @@ class RenderPartialWithRecordIdentificationAndNestedDeeperControllersTest < Acti
def test_render_with_record_in_deeper_nested_controller
get :render_with_record_in_deeper_nested_controller
assert_template %r{\Afun/serious/games/_game\Z}
assert_equal 'Chess', @response.body
assert_equal "Serious Chess\n", @response.body
end
def test_render_with_record_collection_in_deeper_nested_controller
get :render_with_record_collection_in_deeper_nested_controller
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
<%= game.name %>
\ No newline at end of file
Fun <%= game.name %>
<%= game.name %>
\ No newline at end of file
Serious <%= game.name %>
......@@ -354,8 +354,7 @@ h4. Configuring Action Dispatch
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
......@@ -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.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
There are a number of settings available on +config.action_mailer+:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册