ActiveAdmin操作项取决于数据的状态

时间:2012-10-01 19:58:00

标签: ruby-on-rails activeadmin

如果要编辑的对象具有特定状态,我想隐藏编辑路径。

我该怎么做?

5 个答案:

答案 0 :(得分:8)

我终于做到了。我需要两件事:

直接访问时重定向,并将按钮隐藏到编辑页面。

要在用户尝试直接访问编辑页面时重定向,请使用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

答案 1 :(得分:7)

如果您正在讨论隐藏索引操作中默认显示的编辑链接(以及视图和删除链接),您可以按如下方式自定义索引视图:

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。

答案 2 :(得分:2)

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

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会将自定义操作附加到有效的管理默认操作。

答案 3 :(得分:0)

您可以在控制器中创建仅适用于编辑操作的before_filter。它可以检查状态,并允许它运行或redirect_to,具体取决于方法的返回。

应用程序控制器中的类似内容:

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

然后在你的问题控制者的开头

before_filter :some_method, :only => :edit

答案 4 :(得分:-1)

如果你想隐藏对象中某个特定值的“edit”链接(在active_admin视图中),你可以覆盖方法的默认视图,并在显示链接之前添加条件。