Ruby 函数上下文与块



我正在尝试弄清楚以下内容:与活动管理员 UI 生成器一起使用。

为什么这样有效

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

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

我会

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

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

最新更新