ruby on rails 3 -覆盖active_admin表单中的默认作用域



给定一个有许多附件的模型Post,并且一个附件有一个隐藏的标志。在整个应用程序中,我想简单地说一下post。附件,只获取可见的,所以我在附件模型中设置一个默认作用域(使用squeel):

default_scope -> { where { (hidden != true) | (hidden == nil) } } 

但是管理页面需要能够看到一个帖子的所有附件,而不仅仅是可见的附件(所以你可以切换隐藏的复选框)。默认的方法(在admin/posts.rb中)使用default_scope,只允许我编辑可见的:

f.has_many :attachments do |a|
  ...
end

我知道我可以不使用default_scope,而是将其命名为:可见,然后到处(除了管理页面)说post.attachments.可见,但我更喜欢不这样做。

如何取消管理页面上的子附件的作用域?

这是我想出的解决方案:

在app/admin/posts.rb

f.has_many :attachments, for: [:attachments, f.object.attachments_including_hidden] do |a|
  ...
end

和app/models/posts.rb

def attachments_including_hidden
  Attachment.unscoped.where( attachable_id: id )
end

(where Attachment model belongs_to::attachable, polymorphic: true)

怎么回事?ActiveAdmin使用Formtastic,它使用Rails表单生成器。表单。has_many方法是一个ActiveAdmin方法,它调用Formtastic的表单。然后调用Rails的fields_for。for选项将被传递到fields_for,它可以接受一个集合(作为它的第二个参数),所以我显式地将这个集合传递给它。

相关内容

  • 没有找到相关文章

最新更新