如何正确插入控制器名称和操作

时间:2018-02-11 12:31:11

标签: ruby-on-rails

我正在尝试编写一个方法,为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,那么它会正确检查结果。我在插值方面做错了什么?

1 个答案:

答案 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}")