我有一个使用Active Admin 2.13.1的Rails 6.1.7应用程序,我尝试为它创建一个名为:ensure_subtitles
的自定义member_action,但重定向很麻烦。我为:ensure_subtitles
操作尝试的所有方法都无法重定向,要么导致错误,要么没有实际的浏览器重定向。
我有另一个自定义member_action,尽管名称是:update
,但它会重定向到资源路径/show页面,没有问题。
这是具有以下视图的表单:
<%= form_with(model: video,
namespace: :admin,
url: ensure_subtitles_admin_video_path(video),
method: :post) do |form| %>
<% video.subtitle_collections.sort_by(&:language).each do |sc| %>
<%= form.check_box sc.almanac_language_code_id %>
<%= form.label sc.language %>
<br />
<% end %>
<%= form.submit('Resync selected captions') %>
<% end %>
这是我的应用程序/管理员/videos.rb:
ActiveAdmin.register Video do
decorate_with VideoDecorator
menu if: proc { current_user.is_admin? }, priority: 1
actions :index, :show, :edit, :ensure_subtitles
member_action :ensure_subtitles, method: :post do
resource
redirect_to resource_path(format: :html), notice: 'Ensured subtitles'
end
end
在我的浏览器中发生的事情是,它停留在当前视图,而没有遵循重定向-我看了我的本地日志,它确实显示302,然后提供显示页面**,但作为一个XHR请求**(根据Chrome的开发者控制台),这意味着浏览器不改变页面,并保持在表单上。
我还想指出,如果我不在重定向中指定format: :html
,日志将显示以下内容:
Processing by Admin::VideosController#ensure_subtitles as JS
...
Redirected to http://localhost:3000/admin/videos/135165
Completed 302 Found in 21ms (ActiveRecord: 3.0ms | Allocations: 12914)
...
::1 - - [09/Mar/2023:10:56:32 PST] "POST /admin/videos/135165/ensure_subtitles HTTP/1.1" 302 107
http://localhost:3000/admin/videos/135165/resync_subtitle_collections -> /admin/videos/135165/ensure_subtitles
Started GET "/admin/videos/135165" for ::1 at 2023-03-09 10:56:32 -0800
Processing by Admin::VideosController#show as JS
Parameters: {"id"=>"135165"}
User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 72 ORDER BY `users`.`id` ASC LIMIT 1
Completed 500 Internal Server Error in 87ms (Allocations: 6261)
NoMethodError (undefined method `access_denied' for #<Admin::VideosController:0x00000000097b30>
instance_exec(self, exception, &active_admin_namespace.on_unauthorized_access.to_proc)
我不认为这是一个权限问题,因为我在action定义中抛出了一个byebug,并运行了以下代码:
(byebug) authorized? :ensure_subtitles, resource
true
1条答案
按热度按时间hgtggwj01#
在一位同事的帮助下,我想明白了:https://guides.rubyonrails.org/form_helpers.html
在Rails 6.0和5.2中,所有使用form_with的表单都实现了remote:默认情况下为true。这些表单将使用XHR( AJAX )请求提交数据。要禁用此选项,请包括本地:要深入了解,请参阅在Rails中使用JavaScript指南。
因此,我使用
form_with
是在表单中添加一个data-remote='true'
HTML属性,这造成了严重的破坏,因为请求被视为XHR而不是文档请求。该评论还暗示了Rails7中不再有这种行为,尽管我很好奇是否确实如此。