Fix double rendering issue for partials that yield #2424
Merged
+34
−4
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
What are you trying to accomplish?
Fixes #2423
What approach did you choose and why?
ViewComponent::Base
retains a reference to the view context's output buffer. When component templates are evaluated, they do so inside the context ofViewComponent::Base
, and thus append to the retained@output_buffer
instance. However, Rails creates a new output buffer when rendering partials, and temporarily reassigns its own@output_buffer
instance variable. When rendering partials inside a view component,ViewComponent::Base
forwards the block on toview_context.render
, but since the block was created insideViewComponent::Base
, that's where it will be evaluated when called. This means the block will append to the original@output_buffer
and not to the new one Rails creates for the partial. To mitigate the issue, this PR evaluates the block inside the view context withinstance_exec
, which causes the block to append to the correct buffer.