ruby-on-rails 如何装饰Rails中的嵌套ActiveRecord关联

epggiuax  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(179)

我正在处理一个gallery_collection,它有_many collection_objects,并通过这些collection_objects有_many enhanced_objects

class Collection < ActiveRecord::Base
 has_many :collection_objects, inverse_of: :gallery_collection
 has_many :enhanced_objects, through: :collection_objects

最终,在我的GalleryCollection视图中,我公开了单个enhanced_objects,并且我希望公开通过EnhancedObject装饰器可用的方法。在我的特定示例中,我希望能够调用方法object_record_url
如果我装饰gallery_collection,我也可以通过使用GalleryCollectionDecorator中的decorates_association装饰collection_objects

class GalleryCollectionDecorator < Draper::Decorator
  include ActionView::Helpers::UrlHelper

  delegate_all
  decorates_association :collection_objects, with: CollectionObjectDecorator

这很好用,但是我希望能够从collection_objects中访问一个特定的enhanced_object,并且它也被装饰。
我还尝试在CollectionObjectDecorator中使用decorates_association

class CollectionObjectDecorator < Draper::Decorator
  delegate_all
  decorates_association :enhanced_objects, with: EnhancedObjectDecorator
end

但当我从GalleryCollection级别启动装饰级联时,这似乎不起作用。
我正在测试控制台中的结果,如下所示:

collection = GalleryCollection.find(3)
decorated_col = collection.decorate

--返回GalleryCollectionDecorator

collection_objects = decorated_col.collection_objects

--返回CollectionObjectDecorator

enhanced_object = collection_objects[0].enhanced_object

--返回未修饰的enhanced_object

enhanced_object.object_record_url

--返回no方法错误,因为它不能访问decorator方法
我希望能够访问我从GalleryCollection访问的enhanced_object的装饰器方法。有没有办法使用decorates_association来实现这一点,或者有没有更好的、更“Rails”的方法来实现这一点?

7hiiyaii

7hiiyaii1#

  • 检查您的代码-它可能没有拾取更改decorates_association :enhanced_objects, with: EnhancedObjectDecorator
  • 我会尝试不使用delegate_all
  • 确保德雷珀是最新的。可能是你版本的bug?如果这是预期的行为,我希望它被记录下来,所以检查文档。

最坏的情况下,只需编写您自己的ruby:

def enhanced_objects
  @enhanced_objects ||= enhanced_objects.decorate
end

相关问题