Skip to content

Commit 077176f

Browse files
author
Robert Mosolgo
committed
Merge pull request #268 from rmosolgo/prerender-string-props-fix
fix(prerender) accept string props
2 parents 47b81c3 + 7895190 commit 077176f

File tree

6 files changed

+40
-26
lines changed

6 files changed

+40
-26
lines changed

lib/react/rails/view_helper.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def react_component(name, props = {}, options = {}, &block)
99

1010
prerender_options = options[:prerender]
1111
if prerender_options
12-
block = Proc.new{ concat React::ServerRendering.render(name, props.merge(prerender: prerender_options)) }
12+
block = Proc.new{ concat React::ServerRendering.render(name, props, prerender_options) }
1313
end
1414

1515
html_options = options.reverse_merge(:data => {})

lib/react/server_rendering.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ def self.reset_pool
1111
@@pool = ConnectionPool.new(options) { create_renderer }
1212
end
1313

14-
def self.render(component_name, props)
14+
def self.render(component_name, props, prerender_options)
1515
@@pool.with do |renderer|
16-
renderer.render(component_name, props)
16+
renderer.render(component_name, props, prerender_options)
1717
end
1818
end
1919

lib/react/server_rendering/sprockets_renderer.rb

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ def initialize(options={})
1414
@context = ExecJS.compile(js_code)
1515
end
1616

17-
def render(component_name, props)
17+
def render(component_name, props, prerender_options)
1818
# pass prerender: :static to use renderToStaticMarkup
19-
if props.is_a?(Hash) && props[:prerender] == :static
20-
react_render_method = "renderToStaticMarkup"
21-
else
22-
react_render_method = "renderToString"
23-
end
19+
react_render_method = if prerender_options == :static
20+
"renderToStaticMarkup"
21+
else
22+
"renderToString"
23+
end
2424

2525
if !props.is_a?(String)
2626
props = props.to_json

test/react/rails/view_helper_test.rb

+13
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,19 @@ class ViewHelperTest < ActionDispatch::IntegrationTest
4040
end
4141
end
4242

43+
test 'react_component accepts string props with prerender: true' do
44+
html = @helper.react_component('Todo', {todo: 'render on the server'}.to_json, prerender: true)
45+
assert(html.include?('data-react-class="Todo"'), "it includes attrs for UJS")
46+
assert(html.include?('>render on the server</li>'), "it includes rendered HTML")
47+
assert(html.include?('data-reactid'), "it includes React properties")
48+
end
49+
50+
test 'react_component passes :static to SprocketsRenderer' do
51+
html = @helper.react_component('Todo', {todo: 'render on the server'}.to_json, prerender: :static)
52+
assert(html.include?('>render on the server</li>'), "it includes rendered HTML")
53+
assert(!html.include?('data-reactid'), "it DOESNT INCLUDE React properties")
54+
end
55+
4356
test 'react_component accepts HTML options and HTML tag' do
4457
assert @helper.react_component('Foo', {}, :span).match(/<span\s.*><\/span>/)
4558

test/react/server_rendering/sprockets_renderer_test.rb

+9-9
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,40 @@ class SprocketsRendererTest < ActiveSupport::TestCase
66
end
77

88
test '#render returns HTML' do
9-
result = @renderer.render("Todo", {todo: "write tests"})
9+
result = @renderer.render("Todo", {todo: "write tests"}, nil)
1010
assert_match(/<li.*write tests<\/li>/, result)
1111
assert_match(/data-react-checksum/, result)
1212
end
1313

1414
test '#render accepts strings' do
15-
result = @renderer.render("Todo", {todo: "write more tests"}.to_json)
15+
result = @renderer.render("Todo", {todo: "write more tests"}.to_json, nil)
1616
assert_match(/<li.*write more tests<\/li>/, result)
1717
end
1818

19-
test '#render accepts prerender: :static' do
20-
result = @renderer.render("Todo", {todo: "write more tests", prerender: :static})
19+
test '#render accepts :static pre-render option' do
20+
result = @renderer.render("Todo", {todo: "write more tests"}, :static)
2121
assert_match(/<li>write more tests<\/li>/, result)
2222
assert_no_match(/data-react-checksum/, result)
2323
end
2424

2525
test '#render replays console messages' do
26-
result = @renderer.render("TodoListWithConsoleLog", {todos: ["log some messages"]})
26+
result = @renderer.render("TodoListWithConsoleLog", {todos: ["log some messages"]}, nil)
2727
assert_match(/console.log.apply\(console, \["got initial state"\]\)/, result)
2828
assert_match(/console.warn.apply\(console, \["mounted component"\]\)/, result)
2929
assert_match(/console.error.apply\(console, \["rendered!","foo"\]\)/, result)
3030
end
3131

3232
test '#render console messages can be disabled' do
3333
no_log_renderer = React::ServerRendering::SprocketsRenderer.new({replay_console: false})
34-
result = no_log_renderer.render("TodoListWithConsoleLog", {todos: ["log some messages"]})
34+
result = no_log_renderer.render("TodoListWithConsoleLog", {todos: ["log some messages"]}, nil)
3535
assert_no_match(/console.log.apply\(console, \["got initial state"\]\)/, result)
3636
assert_no_match(/console.warn.apply\(console, \["mounted component"\]\)/, result)
3737
assert_no_match(/console.error.apply\(console, \["rendered!","foo"\]\)/, result)
3838
end
3939

4040
test '#render errors include stack traces' do
4141
err = assert_raises React::ServerRendering::SprocketsRenderer::PrerenderError do
42-
@renderer.render("NonExistentComponent", {})
42+
@renderer.render("NonExistentComponent", {}, nil)
4343
end
4444
assert_match(/ReferenceError/, err.to_s)
4545
assert_match(/NonExistentComponent/, err.to_s, "it names the component")
@@ -48,9 +48,9 @@ class SprocketsRendererTest < ActiveSupport::TestCase
4848

4949
test '.new accepts any filenames' do
5050
limited_renderer = React::ServerRendering::SprocketsRenderer.new(files: ["react.js", "components/Todo.js"])
51-
assert_match(/get a real job<\/li>/, limited_renderer.render("Todo", {todo: "get a real job"}))
51+
assert_match(/get a real job<\/li>/, limited_renderer.render("Todo", {todo: "get a real job"}, nil))
5252
err = assert_raises React::ServerRendering::SprocketsRenderer::PrerenderError do
53-
limited_renderer.render("TodoList", {todos: []})
53+
limited_renderer.render("TodoList", {todos: []}, nil)
5454
end
5555
assert_match(/ReferenceError/, err.to_s, "it doesnt load other files")
5656
end

test/react/server_rendering_test.rb

+9-8
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ def initialize(options)
66
@name = options
77
end
88

9-
def render(component_name, props)
10-
"#{@name} rendered #{component_name} with #{props}"
9+
def render(component_name, props, prerender_options)
10+
"#{@name} rendered #{component_name} with #{props} and #{prerender_options}"
1111
end
1212
end
1313

@@ -23,6 +23,7 @@ class ReactServerRenderingTest < ActiveSupport::TestCase
2323
teardown do
2424
React::ServerRendering.renderer = @previous_renderer
2525
React::ServerRendering.renderer_options = @previous_options
26+
React::ServerRendering.reset_pool
2627
end
2728

2829
test '.create_renderer makes a renderer with initialization options' do
@@ -36,20 +37,20 @@ class ReactServerRenderingTest < ActiveSupport::TestCase
3637

3738
test '.render returns a rendered string' do
3839
props = {"props" => true}
39-
result = React::ServerRendering.render("MyComponent", props)
40-
assert_equal("TEST rendered MyComponent with #{props}", result)
40+
result = React::ServerRendering.render("MyComponent", props, "prerender-opts")
41+
assert_equal("TEST rendered MyComponent with #{props} and prerender-opts", result)
4142
end
4243

4344
test '.reset_pool forgets old renderers' do
4445
# At first, they use the first options:
45-
assert_match(/^TEST/, React::ServerRendering.render(nil, nil))
46-
assert_match(/^TEST/, React::ServerRendering.render(nil, nil))
46+
assert_match(/^TEST/, React::ServerRendering.render(nil, nil, nil))
47+
assert_match(/^TEST/, React::ServerRendering.render(nil, nil, nil))
4748

4849
# Then change the init options and clear the pool:
4950
React::ServerRendering.renderer_options = "DIFFERENT"
5051
React::ServerRendering.reset_pool
5152
# New renderers are created with the new init options:
52-
assert_match(/^DIFFERENT/, React::ServerRendering.render(nil, nil))
53-
assert_match(/^DIFFERENT/, React::ServerRendering.render(nil, nil))
53+
assert_match(/^DIFFERENT/, React::ServerRendering.render(nil, nil, nil))
54+
assert_match(/^DIFFERENT/, React::ServerRendering.render(nil, nil, nil))
5455
end
5556
end

0 commit comments

Comments
 (0)