我正在尝试编写一个方法,为application_controller
中的所有控制器动态分配控制器名称和操作,但我似乎无法正确插值。如果我硬编码我想要的东西,它将呈现正确的页面,因此它似乎只是插值就是问题。
这就是我所拥有的:
def authorized
render 'pages/unauthorized' unless Policy.new(current_user.role)."#{controller_name.singularize}_#{action_name}"
end
返回
syntax error, unexpected tSTRING_BEG, expecting '(' ...Policy.new(current_user.role)."#{controller_name.singularize... ... ^
如果我将整个内容包装在( )
中,那么语法错误会消失,但后来我得到了:
undefined method `call' for #<Policy:0x00007ff29ced4ae0 @role="user">
如果我硬编码Policy.new(current_user.role).wiki_show
,那么它会正确检查结果。我在插值方面做错了什么?
答案 0 :(得分:0)
您可以使用Object#public_send
:
public_send(string [,args ...])→obj
调用symbol标识的方法,传递任何参数 指定。与send不同,#public_send仅调用公共方法。什么时候 该方法由字符串标识,该字符串转换为a 符号
它的工作原理如下:
class Foo
def bar
'bar'
end
end
bar_method = 'bar'
p Foo.new.public_send(bar_method) # "bar"
所以你可以做到
Policy.new(current_user.role).public_send("#{controller_name.singularize}_#{action_name}")