ruby-on-rails Rails ActiveAdmin中的自定义member_action无法重定向到其他路由

nwwlzxa7  于 2023-03-13  发布在  Ruby
关注(0)|答案(1)|浏览(123)

我有一个使用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
hgtggwj0

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中不再有这种行为,尽管我很好奇是否确实如此。

相关问题