我终于做到了.我需要两件事:
直接访问时重定向并将按钮隐藏到编辑页面.
要在用户尝试直接访问编辑页面时重定向,我使用before_filter:
before_filter :some_method, :only => [:edit, :update]
def some_method
redirect_to action: :show if status == something
end
Run Code Online (Sandbox Code Playgroud)
要隐藏按钮,我这样做:
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
Run Code Online (Sandbox Code Playgroud)
如果您正在讨论隐藏索引操作中默认显示的编辑链接(以及视图和删除链接),您可以按如下方式自定义索引视图:
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
Run Code Online (Sandbox Code Playgroud)
因为列的内容将只是column块返回的内容,所以您需要一次性返回所有三个(或两个)链接作为字符串.这里raw使用的是显示实际链接而不是链接的html.
before_filter您可以在控制器中创建一个仅适用于编辑操作的控制器。它可以检查状态,并允许它运行或redirect_to取决于方法的返回。
您的应用程序控制器中类似这样的内容:
def some_method
if foo.bar == true
redirect_to foos_path
end
end
Run Code Online (Sandbox Code Playgroud)
然后在你的问题控制器的开头
before_filter :some_method, :only => :edit
Run Code Online (Sandbox Code Playgroud)