I am working on putting captions for videos into a database interface, so the information needs to render into a VTT file for HTML5 tags to be able to display closed captions.
in my controller, the show method:
def show
@track = Track.find(params[:id])
@cues = @track.track_cues
@dash = " --> "
render template: 'tracks/show', layout: 'tracks', formats: [:vtt]
end
so in my show.vtt.haml file, I have:
WEBVTT
= print "\n"
- @cues.each do |cue|
= cue.identifier
= cue.start_time.strftime("%H:%M:%S.%L") + @dash + cue.end_time.strftime("%H:%M:%S.%L")
= print "\n"
Which currently renders as the following screenshot
Instead, it SHOULD be rendering like thus:
WEBVTT
1
0:00:00.000 --> 0:00:03.000 line:90%
2
0:00:03.000 --> 0:00:06.000 line:90%
I'm not sure what I'm doing wrong here that has it rendering the entity code instead of the greater than character.
Rails escapes everything in the view by default. However, you can circumvent sanitisation by using raw
:
= raw(cue.start_time.strftime("%H:%M:%S.%L") + @dash + cue.end_time.strftime("%H:%M:%S.%L"))
or, haml-specific, the !=
operator has the same effect as prepending raw
:
!= cue.start_time.strftime("%H:%M:%S.%L") + @dash + cue.end_time.strftime("%H:%M:%S.%L")
(In ERB
, <%== %>
would have the equivalent effect.)