无法运行after_action turbo_stream操作的回调

Unable to run after_action callback for turbo_stream actions

提问人:Juzer Shakir 提问时间:1/21/2023 更新时间:1/21/2023 访问量:130

问:

所以我有一个 '' 控制器,其中某些操作具有相应的模板,以使用带有分页 (pagy) 的热线从数据库延迟加载实例。在这些操作中,我想将类似的逻辑分解到回调中(遵循 DRY 原则)。ThaaliTakhmeensturbo_streamafter_action

将代码分解为 ,实例不会显示在页面上,实际上根本没有执行,我通过提供 来验证。我还为这些操作提供了一个非常有效的操作。after_actionafter_actiondebuggerbefore_action

代码如下:

after_action :set_pagy_thaalis_total, only: [:complete, :pending, :all]

    def complete
        @tt = ThaaliTakhmeen.includes(:sabeel).completed_year(@year)
    end

    def pending
        @tt = ThaaliTakhmeen.includes(:sabeel).pending_year(@year)
    end

    def all
        @tt = ThaaliTakhmeen.includes(:sabeel).in_the_year(@year)
    end

private

        def set_pagy_thaalis_total
            @total = @tt.count
            @pagy, @thaalis = pagy_countless(@tt, items: 8)
            debugger
        end

以下是访问“”操作的日志:complete

Started GET "/takhmeens/2022/complete" for ::1 at 2023-01-21 10:07:35 +0530
Processing by ThaaliTakhmeensController#complete as HTML
  Parameters: {"year"=>"2022"}
  Rendering layout layouts/application.html.erb
  Rendering thaali_takhmeens/complete.html.erb within layouts/application
  Rendered shared/_results.html.erb (Duration: 2.4ms | Allocations: 2088)
  Rendered thaali_takhmeens/complete.html.erb within layouts/application (Duration: 3.7ms | Allocations: 2396)
  Rendered layout layouts/application.html.erb (Duration: 3.9ms | Allocations: 2477)
Completed 500 Internal Server Error in 6ms (ActiveRecord: 0.0ms | Allocations: 3027)


  
ActionView::Template::Error (undefined method `any?' for nil:NilClass

'.freeze;         if instances.any? 
                              ^^^^^):
    1: <%= turbo_frame_tag :results, data: { turbo_action: "advance" } do %>
    2:     <div class="container text-center mt-5">
    3:         <% if instances.any? %>
    4:             <%= render partial: "theader" %>
    5:             <div id=<%="#{id}"%> ></div>
    6:             <%= turbo_frame_tag :pagination, loading: :lazy, src: path %> %>
  
app/views/shared/_results.html.erb:3
app/views/shared/_results.html.erb:1
app/views/thaali_takhmeens/complete.html.erb:8

由于回调没有运行,因此没有设置 () 对象,因此会出现此错误,也没有执行。after_actioninstances@thaalisdebugger

这里的操作同时具有 和 模板。需要明确的是,内容加载完全正常,不需要回调,但这将违反 DRY 原则。completeHTMLturbo_steamafter_action

那么解决方法是什么呢?有没有其他方法可以重构代码,或者我是否应该在回调方法中显式设置一些东西才能执行它?

ruby-on-rails 回调 热线导轨

评论


答:

1赞 Maxence 1/21/2023 #1

问得好。我实际上不经常使用after_action,必须检查。https://guides.rubyonrails.org/action_controller_overview.html#after-filters-and-around-filters我认为发生的情况是,视图的渲染是操作的一部分。

在你的情况下,这是推断的,你对这样的块没有回应:

respond_to do |format|
  if @record.update(record_params)
    format.html { redirect_to a_record_route }
  else
    format.html { render :edit, status: :unprocessable_entity }
  end
end

但是模板的呈现仍然发生在操作中。在设置一些对视图有用的实例变量之前。 如果你真的想让你的控制器变干,你可以做的就是在每个动作的末尾添加并删除after_action。set_pagy_thaalis_total

EDIt:另外,你的视图是html.erb或turbo_stream.erb文件这一事实并不重要。

评论

1赞 Juzer Shakir 1/21/2023
非常感谢您的输入!我在所需的操作中明确提到了该方法,它工作得很好。再次感谢!:)顺便说一句,我正在使用after_action ;)
1赞 Maxence 1/21/2023
很高兴它起作用了!当然,当我们讨论 ofc :) 时,我改变了我的帖子after_action