ruby-on-rails 无法为turbo_stream操作运行after_action回调

1wnzp6jl  于 2023-01-22  发布在  Ruby
关注(0)|答案(1)|浏览(180)

我有一个"ThaaliTakhmeens"控制器,其中一些操作有相应的turbo_stream模板,以便使用带分页功能的hotwire从数据库惰性加载示例。在这些操作中,有一个类似的逻辑,我希望将其分解到after_action回调中(遵循DRY原则)。
将代码分解成after_action后,示例不会显示在页面上,事实上after_action根本不会执行,我通过在其中提供debugger进行了验证。我还为这些操作提供了before_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_action回调没有运行,instances@thaalis)对象没有设置,因此显示此错误,并且debugger也没有执行。
这里的complete动作有HTMLturbo_steam两个模板,需要说明的是,内容加载非常好,不需要after_action回调,但这违反了DRY原则。
那么解决这个问题的方法是什么呢?有没有其他的方法来重构代码,或者我必须在回调方法中显式地设置一些东西来执行它?

w41d8nur

w41d8nur1#

问得好。我实际上不经常使用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

但是模板的渲染仍然发生在动作中,在你设置一些对视图有用的示例变量之前,如果你真的想耗尽你的控制器,你可以做的是在每个动作的末尾添加set_pagy_thaalis_total,并删除after_action。
编辑:事实上,你的视图是一个html.erb还是turbo_stream.erb文件并不重要。

相关问题