我想实现什么目标:
def append_data
data = params[:data]
@response = ApiDataService.append_data(data)["data"]
if @response.present?
flash[:success] = "Data appended successfully"
respond_to do |format|
format.turbo_stream do
render turbo_stream: turbo_stream.replace(
"response", partial: "dashboard/response", locals: { response: @response }
)
end
end
else
flash[:error] = "Failed to append data"
redirect_to root_path
end
end
<%= form_with url: dashboard_append_data_path(format: :turbo_stream) do |form| %>
<div class="form-group">
<label for="data">Paste JSON data here:</label>
<%= form.text_area :data, class: 'form-control', required: true, id: 'data', rows: 10 %>
</div>
<div class="row justify-content-center my-3 px-3">
<%= form.submit "Submit Data", class: 'btn btn-primary btn-block my-2' %>
</div>
<% end %>
<%= turbo_frame_tag :response do %>
text to be replaced
<% end %>
post 'dashboard/append_data', to: 'dashboard#append_data'
<div id="response">
<p><%= response %></p>
</div>
<form action="/dashboard/append_data.turbo_stream" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="" autocomplete="off">
<div class="form-group">
<label for="data">Paste JSON data here:</label>
<textarea class="form-control" required="required" id="data" rows="10" name="data"></textarea>
</div>
<div class="row justify-content-center my-3 px-3">
<input type="submit" name="commit" value="Submit Data" class="btn btn-primary btn-block my-2" data-disable-with="Submit Data">
</div>
</form>
<turbo-frame id="response">
text to be replaced
</turbo-frame>
使用提交后的当前设置,我将被重定向到此路径:
/dashboard/append_data.turbo_stream
并且应该使用 id=response 更新 Turbo 框架的内容将作为新页面打开,并带有提到的路径,甚至不会渲染,以纯文本形式显示。
如果我从index.html.erb中删除格式::turbo_stream参数:
<%= form_with url: dashboard_append_data_path do |form| %>
任何人都知道发生了什么,为什么我不能使表单仅更新该 div? 另一种方法是使用 AJAX 请求,但涡轮流应该是更 Rails 的方法。 应该很容易实现这一点,因为并不复杂。
我不知道这是否是由于 Javascript 造成的,但在我的情况下,浏览器似乎是问题所在。 我在 Firefox 上测试它,切换到 Chrome 解决了问题,现在它就像一个魅力。