gpt4 book ai didi

ruby-on-rails - Rails 过滤器钩子(Hook)用于在 Controller 操作运行之后、 View 呈现之前

转载 作者:行者123 更新时间:2023-12-03 03:52:54 24 4
gpt4 key购买 nike

我有一个 spree commerce 2.1.1 应用程序 (Rails 4.0.0),我想在产品详细信息页面上显示一些“相关产品”。相关产品只是随机选择的与正在查看的产品具有相同品牌/性别的产品。它正在工作......我已经制作了 products_controller_decorator.rb,它扩展了 spree 的 products_controller.rb

Spree 的 products_controller.rb 有一个 before_filter,它设置 @product:

before_filter :load_product, :only => :show

我自己的装饰器有一个设置@lated_products

的方法
before_filter :get_related_products, :only => :show

问题是:

a) 碰巧的是,load_product before 过滤器在我的 get_lated_products before 过滤器之前被调用,所以巧合的是,我可以访问 @product 它设置的变量。但据我所知,并不能保证这种情况会发生。我想确保稍后调用我的过滤器...

b) Spree 的 show 方法还设置 @taxon,我真的很希望能够在我自己的 get_lated_products 方法中使用它.

所以,我想要的是像 CakePHP 的 before_render 这样的钩子(Hook),它在 Controller 方法运行之后、 View 渲染之前被调用。我似乎找不到与 Rails 相当的东西。有这样的事吗? after_filter 不会为我做这件事,因为它是在 View 渲染后调用的。

如果没有,在 Spree 的产品 Controller 的 show 方法运行后,以某种方式附加调用 get_lated_products 的最佳方法是什么我可以获得它的实例变量?

最佳答案

a) Spree 的 load_product 始终会在您的 get_lated_products 之前调用,因为它之前已注册。

b) 在 before_filterafter_filter 之间没有 before_render,也没有过滤器。

您可以通过覆盖 :render 来实现此目的:

class Spree::ProductsController.class_eval do
def render(options = nil, extra_options = {}, &block)
# here you define related products
@related_products = search_related_products(@product)

# don't forget to call super
super(options, extra_options, &block)
end
end

关于ruby-on-rails - Rails 过滤器钩子(Hook)用于在 Controller 操作运行之后、 View 呈现之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19308121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com