Comments (5)
But I found a document say that format is automatically switched:
code:
turbo-rails/app/models/turbo/streams/tag_builder.rb
Lines 14 to 17 in 79b5ffd
commit: 969d899
Did I misunderstand?
from turbo-rails.
I'd like to request a reopening of this issue.
Currently this results in an unintuitive behavior where if you have a controller action do implicit rendering to a Turbo Stream template, and that template renders (via a standard render
method) an HTML partial, the format switching happens automatically.
Once you so much as add respond_to
to the controller action, that format switching turns off, and you have to modify the render
call inside the first template to explicitly request the HTML partial.
Illustration below. Hope this makes sense.
Works
x_controller.rb
def new
end
new.turbo_stream.erb
render 'form', x: ...
_form.html.erb
<form>...
Breaks
x_controller.rb
def new
respond_to do |format|
format.turbo_stream
format.html { redirect_to ... }
end
end
new.turbo_stream.erb
render 'form'
_form.html.erb
<form>...
Workaround
x_controller.rb
def new
respond_to do |format|
format.turbo_stream
format.html { redirect_to ... }
end
end
new.turbo_stream.erb
render partial: 'form', formats: :html, locals: { x: ... }
_form.html.erb
<form>...
from turbo-rails.
@chloerei you may have already figured this out but the docs you are referring to reference the call that DHH mentioned, meaning if you use the turbo_stream.append
helper you get the format switching "automatically", but if you are using the standard render
call you'll need to explicity define formats: [:html]
from turbo-rails.
That is the correct behavior in the sense that the turbo stream template is assuming all partials will also be turbo stream templates, unless you change that. We have a helper when you do the inline call, though:
<%= turbo_stream.append 'messages', @message %>
It also work with the partial options:
<%= turbo_stream.append 'messages', partial: "messages/message" %>
But if you call your own render partial, you need to add the formats options.
Feel free to look at a doc change to make this clearer.
from turbo-rails.
As @kylekeesling mentions above, a standard render call requires the format to be explicitly defined. For example, a failure case from form submission may look like:
render :show, status: :unprocessable_entity, formats: :html
Reason being the resulting error: ActionView::MissingTemplate indicates that it is trying to render :formats=>[:turbo_stream]
which if you only have the HTML template it isn't going to work. (what DHH said above) Hence the above explicit definition is necessary
from turbo-rails.
Related Issues (20)
- `refresh` action is missing from Turbo::Streams::TagBuilder HOT 5
- Turbo Frame Responses missing tracked elements HOT 6
- Usage of anchor HOT 5
- Websocket doesn't work on production
- rails tests fail after turbo-rails upgrade from 1.5.0 to 2.0.3 HOT 5
- Single quotes not properly handled in Turbo Streams broadcast
- Content duplication on using render in controllers HOT 1
- Chrome reloads assets in the Link preload header HOT 1
- Uglifier::Error during assets:precompile HOT 1
- Turbo not streaming changes properly / window.Turbo is undefined HOT 3
- InstaClick prefetch not working with fragment cache
- Prefetch causes turbo stream to render on hover instead of on click HOT 4
- Inverted parameters in stream responses HOT 2
- unexpected routes added as part of the turbo rails gem HOT 2
- When streaming from a worker, path helpers append a domain `https://example.com` HOT 5
- Turbo Documentation need a "Broadcast" chatper
- Refresh broadcasts generated without changes
- Incompatible with Solid_Queue HOT 1
- turbo_frame_request_id safe operator in not handled correctly HOT 2
- Shouldn't broadcast refresh if streamables == [nil] HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from turbo-rails.