ruby-on-rails 取决于数据状态的ActiveAdmin操作项

4sup72z8  于 2023-02-17  发布在  Ruby
关注(0)|答案(6)|浏览(139)

如果要编辑的对象具有某种状态,我希望隐藏编辑路径。
我该怎么做呢?

mv1qrgav

mv1qrgav1#

我终于做到了。我需要两样东西:
直接访问时重定向并隐藏编辑页面的按钮。
为了在用户试图直接访问编辑页面时进行重定向,我使用了before_filter:

before_filter :some_method, :only => [:edit, :update]
def some_method
    redirect_to action: :show if status == something
end

要隐藏按钮,我这样做:

ActiveAdmin.register Model do
    config.clear_action_items!
    action_item :only => [:show] , :if => proc { instance.status == something } do
        link_to 'Edit', edit_model_path(instance)
    end
end
jucafojl

jucafojl2#

如果您要隐藏索引操作中默认显示的编辑链接(沿着查看和删除链接),则可以按如下方式自定义索引视图:

ActiveAdmin.register Model do

  index do

    column :actions do |object|

      raw( %(#{link_to "View", [:admin, object]} 
        #{link_to "Delete", [:admin, object], method: :delete} 
        #{(link_to"Edit", [:edit, :admin, object]) if object.status? }) )

    end
  end
end

因为列的内容只是column块返回的内容,所以你需要一次返回所有三个(或两个)链接作为一个字符串,这里使用raw是为了显示实际的链接,而不是链接的html。

iecba09b

iecba09b3#

这可以通过以下方式实现:

ActiveAdmin.register Object do
  index do
    column :name
    actions defaults: true do |object|
      link_to 'Archive', archive_admin_post_path(post) if object.status?
    end
  end
end

请注意,使用defaults: true会将您的自定义操作附加到活动的管理员默认操作中。

wdebmtf2

wdebmtf24#

你可以在你的控制器中创建一个只应用于编辑操作的before_filter。它可以检查状态,并允许它运行或redirect_to,这取决于方法的返回。
在应用程序控制器中类似于以下内容:

def some_method
  if foo.bar == true
    redirect_to foos_path
  end
end

然后在问题的开头

before_filter :some_method, :only => :edit
ehxuflar

ehxuflar5#

一个完全可定制的解决方案是使用授权适配器,可以是定制的,也可以是库,如pundit或cancan:https://activeadmin.info/13-authorization-adapter.html
我的用例是基于上下文限制操作(例如,用户编辑)。我在本地解决了这个问题,如下所示:

controller do
  def action_methods
    if condition?
      super
    else
      super - ['edit', 'update']
    end
  end
end
1yjd4xko

1yjd4xko6#

如果你想隐藏对象的“编辑”链接(在active_admin视图中)如果对象持有一些特定的值,你可以覆盖方法的默认视图并在链接显示之前添加条件.

相关问题