Rails 6: 表单与 remote: true 和 Turbolinks 在重定向后不显示 flash
Rails 6: form with remote: true and Turbolinks not showing flash after redirect
我 <%= simple_form_for @offer, remote: true %>
启用了 Turbolinks。我正在尝试在我的 update
操作中使用类似这样的内容重定向并显示成功 flash:
respond_to do |format|
if @offer.update(offer_params)
flash[:success] = "#{@offer.name} #{t(:updated)}"
format.html { redirect_to seller_offers_path }
format.js
else
format.html { render :edit }
end
end
我的 update.js.erb
有与重定向或 flash 无关的代码:
$(".ibox-content.actions").removeClass('sk-loading');
$('.sk-spinner').css("display", "none");
在 application.html.erb 我可以用这个渲染 flash:
<div class="row">
<% flash.each do |message_type, message| %>
<%= content_tag(:div, content_tag(:strong, message), id: "flash_message",
class: "text-bold alert alert-#{message_type}") %>
<% end %>
</div>
目前我的表单已保存,但没有重定向。
当我在 update.js.erb
表单中添加 Turbolinks.visit(<%= seller_offers_path %>)
保存时,重定向完成,但是没有 flash。
请问有什么方法可以让我使用 Turbolinks 和 remote: true
在重定向页面上显示 Flash? 到目前为止我已经尝试过 this suggestion,但是它仅适用于在同一页面上显示 flash - 它不适用于 redirect_to
.
更新
这确实重定向了,但是没有 flash:
respond_to do |format|
if @offer.update(offer_params)
format.js { redirect_to seller_offers_path, success: "#{@offer.name} #{t(:updated)}" }
else
format.html { render :edit }
end
end
更新 2
目前我正在尝试实现类似
Turbolinks.visit(url, { keep: 'flash' });
与 mentioned in docs 一样,但似乎不适用于 Turbolinks 5.2
更新 3
我已经移除 update.js.erb
并且在我的控制器中我有
def update
if @offer.update(offer_params)
flash[:success] = "#{@offer.name} #{t(:updated)}"
redirect_to seller_offers_path
else
render :edit
end
end
重定向已按预期完成,但 index
上仍然没有显示 flash。我可以在 update
操作结束时打印我的闪光灯:
#<ActionDispatch::Flash::FlashHash:0x00007f180d2a1c60 @discard=#<Set: {}>, @flashes={"success"=>"My offer updated!"}, @now=nil>
但是在 index
操作结束时(我 redirect_to)它是空的:
#<ActionDispatch::Flash::FlashHash:0x00007f180eb3b780 @discard=#<Set: {}>, @flashes={}, @now=nil>
看来我的闪存没有为下一个请求保留。是因为 Turbolinks,还是其他原因?我很乐意提供任何提示。
远程表单提交后重定向
当您使用通过 JS 提交的表单时(例如 remote: true
或默认的 form_with
),Rails 将查找并呈现常规的 js
响应(在此case offers/update.js.erb
) 并忽略任何其他,例如 html
重定向。
您的原始 update.js.erb
不包含任何代码来执行对重定向位置的访问,因此它只删除了 class 名称并隐藏了微调器。
如您所知,js
响应需要将 Turbolinks visit
生成到重定向位置。在提交表单后清除 Turbolinks 缓存也是一个好主意,因此您的 update.js.erb
可能类似于:
$(".ibox-content.actions").removeClass('sk-loading');
$('.sk-spinner').css("display", "none");
Turbolinks.clearCache();
Turbolinks.visit(<%= seller_offers_path %>);
如果您安装了 turbolinks-rails gem,并且不需要 运行 任何自定义 JS,如上面的前两行,那么在您的控制器中您可以简单地做:
def update
if @offer.update(offer_params)
flash[:success] = "#{@offer.name} #{t(:updated)}"
redirect_to seller_offers_path
else
render :edit # see note below*
end
你不需要update.js.erb
; turbolinks-rails 会自动清除缓存并访问重定向路径。这很好,因为它使您的控制器代码保持整洁(不需要 respond_to
),并且适用于 HTML 和 JS 请求。
* 值得注意的是,JS 请求的错误响应仍然需要手动处理。为此,您可能会发现此评论很有用:https://github.com/turbolinks/turbolinks/issues/85#issuecomment-338784510
缺少闪光灯
我认为你的 flash 没有显示在你更新的代码中的原因是因为你在 redirect_to, which only supports
noticeand
alert` 中使用 shorthand 设置 flash 消息的风格:
redirect_to seller_offers_path, notice: '…' # sets flash[:notice]
redirect_to seller_offers_path, alert: '…' # sets flash[:slert]
redirect_to seller_offers_path, success: '…' # doesn't work
如果您想使用自己的闪光键,您需要明确设置闪光灯:
flash[:success] = "#{@offer.name} #{t(:updated)}"
我还应该补充一点,Turbolinks 5 不支持 Turbolinks keep
选项。我认为这是 Turbolinks 2 或 3 中的一个功能。Turbolinks README 是最多的地方-最新文档。
希望对您有所帮助:)
我 <%= simple_form_for @offer, remote: true %>
启用了 Turbolinks。我正在尝试在我的 update
操作中使用类似这样的内容重定向并显示成功 flash:
respond_to do |format|
if @offer.update(offer_params)
flash[:success] = "#{@offer.name} #{t(:updated)}"
format.html { redirect_to seller_offers_path }
format.js
else
format.html { render :edit }
end
end
我的 update.js.erb
有与重定向或 flash 无关的代码:
$(".ibox-content.actions").removeClass('sk-loading');
$('.sk-spinner').css("display", "none");
在 application.html.erb 我可以用这个渲染 flash:
<div class="row">
<% flash.each do |message_type, message| %>
<%= content_tag(:div, content_tag(:strong, message), id: "flash_message",
class: "text-bold alert alert-#{message_type}") %>
<% end %>
</div>
目前我的表单已保存,但没有重定向。
当我在 update.js.erb
表单中添加 Turbolinks.visit(<%= seller_offers_path %>)
保存时,重定向完成,但是没有 flash。
请问有什么方法可以让我使用 Turbolinks 和 remote: true
在重定向页面上显示 Flash? 到目前为止我已经尝试过 this suggestion,但是它仅适用于在同一页面上显示 flash - 它不适用于 redirect_to
.
更新
这确实重定向了,但是没有 flash:
respond_to do |format|
if @offer.update(offer_params)
format.js { redirect_to seller_offers_path, success: "#{@offer.name} #{t(:updated)}" }
else
format.html { render :edit }
end
end
更新 2
目前我正在尝试实现类似
Turbolinks.visit(url, { keep: 'flash' });
与 mentioned in docs 一样,但似乎不适用于 Turbolinks 5.2
更新 3
我已经移除 update.js.erb
并且在我的控制器中我有
def update
if @offer.update(offer_params)
flash[:success] = "#{@offer.name} #{t(:updated)}"
redirect_to seller_offers_path
else
render :edit
end
end
重定向已按预期完成,但 index
上仍然没有显示 flash。我可以在 update
操作结束时打印我的闪光灯:
#<ActionDispatch::Flash::FlashHash:0x00007f180d2a1c60 @discard=#<Set: {}>, @flashes={"success"=>"My offer updated!"}, @now=nil>
但是在 index
操作结束时(我 redirect_to)它是空的:
#<ActionDispatch::Flash::FlashHash:0x00007f180eb3b780 @discard=#<Set: {}>, @flashes={}, @now=nil>
看来我的闪存没有为下一个请求保留。是因为 Turbolinks,还是其他原因?我很乐意提供任何提示。
远程表单提交后重定向
当您使用通过 JS 提交的表单时(例如 remote: true
或默认的 form_with
),Rails 将查找并呈现常规的 js
响应(在此case offers/update.js.erb
) 并忽略任何其他,例如 html
重定向。
您的原始 update.js.erb
不包含任何代码来执行对重定向位置的访问,因此它只删除了 class 名称并隐藏了微调器。
如您所知,js
响应需要将 Turbolinks visit
生成到重定向位置。在提交表单后清除 Turbolinks 缓存也是一个好主意,因此您的 update.js.erb
可能类似于:
$(".ibox-content.actions").removeClass('sk-loading');
$('.sk-spinner').css("display", "none");
Turbolinks.clearCache();
Turbolinks.visit(<%= seller_offers_path %>);
如果您安装了 turbolinks-rails gem,并且不需要 运行 任何自定义 JS,如上面的前两行,那么在您的控制器中您可以简单地做:
def update
if @offer.update(offer_params)
flash[:success] = "#{@offer.name} #{t(:updated)}"
redirect_to seller_offers_path
else
render :edit # see note below*
end
你不需要update.js.erb
; turbolinks-rails 会自动清除缓存并访问重定向路径。这很好,因为它使您的控制器代码保持整洁(不需要 respond_to
),并且适用于 HTML 和 JS 请求。
* 值得注意的是,JS 请求的错误响应仍然需要手动处理。为此,您可能会发现此评论很有用:https://github.com/turbolinks/turbolinks/issues/85#issuecomment-338784510
缺少闪光灯
我认为你的 flash 没有显示在你更新的代码中的原因是因为你在 redirect_to, which only supports
noticeand
alert` 中使用 shorthand 设置 flash 消息的风格:
redirect_to seller_offers_path, notice: '…' # sets flash[:notice]
redirect_to seller_offers_path, alert: '…' # sets flash[:slert]
redirect_to seller_offers_path, success: '…' # doesn't work
如果您想使用自己的闪光键,您需要明确设置闪光灯:
flash[:success] = "#{@offer.name} #{t(:updated)}"
我还应该补充一点,Turbolinks 5 不支持 Turbolinks keep
选项。我认为这是 Turbolinks 2 或 3 中的一个功能。Turbolinks README 是最多的地方-最新文档。
希望对您有所帮助:)