提问人:Juzer Shakir 提问时间:1/21/2023 更新时间:1/21/2023 访问量:130
无法运行after_action turbo_stream操作的回调
Unable to run after_action callback for turbo_stream actions
问:
所以我有一个 '' 控制器,其中某些操作具有相应的模板,以使用带有分页 (pagy) 的热线从数据库延迟加载实例。在这些操作中,我想将类似的逻辑分解到回调中(遵循 DRY 原则)。ThaaliTakhmeens
turbo_stream
after_action
将代码分解为 ,实例不会显示在页面上,实际上根本没有执行,我通过提供 来验证。我还为这些操作提供了一个非常有效的操作。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
这里的操作同时具有 和 模板。需要明确的是,内容加载完全正常,不需要回调,但这将违反 DRY 原则。complete
HTML
turbo_steam
after_action
那么解决方法是什么呢?有没有其他方法可以重构代码,或者我是否应该在回调方法中显式设置一些东西才能执行它?
答:
问得好。我实际上不经常使用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文件这一事实并不重要。
评论
after_action
;)
after_action
下一个:创建回调后什么时候可以回滚?
评论