提交 7b63f56c 编写于 作者: M Matthew Draper 提交者: GitHub

Merge pull request #26672 from schpet/support_ruby_keywords_as_template_locals

Avoid compiling ruby keywords into template locals
* Render now accepts any keys for locals, including reserved words
Only locals with valid variable names get set directly. Others
will still be available in local_assigns.
Example of render with reserved words:
```erb
<%= render "example", class: "text-center", message: "Hello world!" %>
<!-- _example.html.erb: -->
<%= tag.div class: local_assigns[:class] do %>
<p><%= message %></p>
<% end %>
```
*Peter Schilling*, *Matthew Draper*
* Show cache hits and misses when rendering partials.
Partials using the `cache` helper will show whether a render hit or missed
......
require "active_support/core_ext/object/try"
require "active_support/core_ext/kernel/singleton_class"
require "active_support/core_ext/module/delegation"
require "thread"
module ActionView
......@@ -324,8 +325,13 @@ def handle_render_error(view, e) #:nodoc:
end
def locals_code #:nodoc:
# Only locals with valid variable names get set directly. Others will
# still be available in local_assigns.
locals = @locals.to_set - Module::DELEGATION_RESERVED_METHOD_NAMES
locals = locals.grep(/\A(?![A-Z0-9])(?:[[:alnum:]_]|[^\0-\177])+\z/)
# Double assign to suppress the dreaded 'assigned but unused variable' warning
@locals.each_with_object("") { |key, code| code << "#{key} = #{key} = local_assigns[:#{key}];" }
locals.each_with_object("") { |key, code| code << "#{key} = #{key} = local_assigns[:#{key}];" }
end
def method_name #:nodoc:
......
<%= local_assigns.inspect.html_safe %>
\ No newline at end of file
The class is <%= local_assigns[:class] %>
\ No newline at end of file
......@@ -9,6 +9,25 @@ def test_template_with_nil_erb_return
assert_equal "This is nil: \n", render(template: "test/nil_return")
end
def test_template_with_ruby_keyword_locals
assert_equal "The class is foo",
render(file: "test/render_file_with_ruby_keyword_locals", locals: { class: "foo" })
end
def test_template_with_invalid_identifier_locals
locals = {
foo: "bar",
Foo: "bar",
"d-a-s-h-e-s": "",
"white space": "",
}
assert_equal locals.inspect, render(file: "test/render_file_inspect_local_assigns", locals: locals)
end
def test_template_with_unicode_identifier
assert_equal "🎂", render(file: "test/render_file_unicode_local", locals: { 🎃: "🎂" })
end
def test_template_gets_recompiled_when_using_different_keys_in_local_assigns
assert_equal "one", render(file: "test/render_file_with_locals_and_default")
assert_equal "two", render(file: "test/render_file_with_locals_and_default", locals: { secret: "two" })
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册