我有一个"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
动作有HTML
和turbo_steam
两个模板,需要说明的是,内容加载非常好,不需要after_action
回调,但这违反了DRY原则。
那么解决这个问题的方法是什么呢?有没有其他的方法来重构代码,或者我必须在回调方法中显式地设置一些东西来执行它?
1条答案
按热度按时间w41d8nur1#
问得好。我实际上不经常使用after_action,所以不得不检查。https://guides.rubyonrails.org/action_controller_overview.html#after-filters-and-around-filters我认为发生的是视图的渲染是操作的一部分。
在您的情况下,这是推断,你没有响应块像这样:
但是模板的渲染仍然发生在动作中,在你设置一些对视图有用的示例变量之前,如果你真的想耗尽你的控制器,你可以做的是在每个动作的末尾添加
set_pagy_thaalis_total
,并删除after_action。编辑:事实上,你的视图是一个html.erb还是turbo_stream.erb文件并不重要。