Ruby 函数上下文与块

Ruby function context vs blocks

我正在尝试计算以下内容: 与活动管理员一起使用 ui builder.

为什么这样行得通

def edit_action
    column "" do |resource|
        links = ''.html_safe
        links += link_to I18n.t('active_admin.edit'), edit_resource_path(resource), :class => "member_link edit_link", :target => '_blank'
        links
    end
end
index do
    edit_action
end

虽然这不是

edit_action = Proc.new{
    column "" do |resource|
        links = ''.html_safe
        links += link_to I18n.t('active_admin.edit'), edit_resource_path(resource), :class => "member_link edit_link", :target => '_blank'
        links
    end
}
index do
    edit_action.call
end

我得到的错误是对象模型(例如)没有方法 'column'

我会说这是一个范围问题:def edit_action 引入了一个新环境,而 Proc.new 从父环境继承了环境。在第一种情况下,column 被识别是因为 ActiveAdminindex 操作提供了它。在第二种情况下,定义 Proc 的范围对任何 column 方法一无所知,因此您会得到您提到的错误。

如果将定义 edit_action = Proc.new{... 移动到 index do... 块中,它应该会再次起作用。