【发布时间】:2018-10-29 20:37:49
【问题描述】:
好的,所以我在使用 Rails Webpacker 浏览我的反应组件中的视频时遇到了问题。我可以让他们玩,但我不能通过他们寻找。
我正在使用 Rails Active Storage 上传视频,然后通过 rails_blob_path(@post.video) 呈现的 html 属性将它们的 url 发送到我的 react 组件(请参阅下面的 sn-p 步骤 9)。在我的反应组件中,我有一个 <video /> 元素,其源是解析后的属性。从那里我有通过React.createRef() 控制元素的方法。其中一种方法(play())按预期工作。但是,我的 seek() 方法没有,我不明白为什么。
我创建了minified example (repo) 来隔离问题,以下是我采取的步骤:
rails new [app] --webpacker=react- cd 进入 [app],
rails active_storage:install rails g scaffold post title:stringrails db:migrate- 将
has_one_attached :video添加到app/models/post.rb - 将
:video添加到app/controllers/posts_controller.rb中的白名单参数中 - 在sn-p下方添加
app/views/posts/_form.html.erb中的表单字段
<div class="field">
<%= form.label :video %>
<%= form.file_field :video %>
</div>
<div id='payload' url='<%= rails_blob_path(@post.video).to_json %>'></div>
<div id='hello-react'></div>
<%= javascript_pack_tag 'hello_react' %>
import React from 'react'
import ReactDOM from 'react-dom'
const node = document.getElementById('payload')
const url = JSON.parse(node.getAttribute('url'))
class App extends React.Component {
componentWillMount() {
this.videoRef = React.createRef()
}
seek = (seekTo = 0) => {
this.videoRef.current.currentTime = seekTo
}
play = () => {
this.videoRef.current.play()
}
render() {
return (
<div>
<video ref={this.videoRef} controls>
<source src={url} type='video/mp4' />
</video>
<button onClick={ (e) => {this.seek(5)} }>+5</button>
<button onClick={ (e) => {this.play()} }>Play</button>
</div>
)
}
}
ReactDOM.render(
<App />,
document.getElementById('hello-react')
)
- 用
rails s启动服务器,转到localhost:3000/posts/new - 创建帖子(您需要上传视频),您将被重定向到
hello-react包。
我以前发过这个,但没有得到答复。这是我第一次制作一个单独的项目并概述了隔离问题的步骤。希望这能传达出我有多绝望。如果我需要解释任何步骤或者你们是否都需要更多信息,请告诉我。提前感谢大家的帮助。
编辑 11/11/18:一个答案指出这是一个浏览器问题。我使用 Chrome 进行所有测试,但是当我使用 FireFox 时,它按预期工作。仍然不确定如何解决此问题,以便该应用可以跨浏览器运行。
【问题讨论】:
标签: javascript html reactjs ruby-on-rails-5.2