在 rails/ruby 中有没有一种方法可以将我的路由代码简化为优雅的,例如:
重定向到 user.role + _url
这样,如果用户是管理员,他们将被路由到管理页面,依此类推,其他用户类型...
在 rails/ruby 中有没有一种方法可以将我的路由代码简化为优雅的,例如:
重定向到 user.role + _url
这样,如果用户是管理员,他们将被路由到管理页面,依此类推,其他用户类型...
当然!
redirect_to send("#{user.role}_url")
在 ruby 中,发送将在接收器上执行该方法,这正是您想要的。通常,这看起来像:
@receiver_object.send(:admin_url)
但是 url-helpers 在全局命名空间中工作,所以你可以发送到全局并让它工作。
简单的测试方法:将其添加到控制器并观看它重定向您的家:
redirect_to send("root_path")
可能最好的方法是使用url_for助手。例如。
redirect_to url_for( :controller => users, :action => user.role )
这将生成路径/users/admin
等/users/guest
。
如果您想以一种骇人听闻的方式进行操作,则可以使用
redirect_to eval("#{user.role}_url")
不过要小心。您的字符串不起作用的原因是它没有被评估,所以redirect_to "admin_url"
什么都不做,它只是一个无意义的字符串,redirect 期望字符串是一个 URL。
如果您评估该字符串,它将起作用,因为redirect_to eval("#{user.role}_url")
将首先转换"admin_url"
为调用该admin_url
方法,该方法返回一些类似 的路径users/admin
,并且该字符串可用于重定向方法。
您可以使用render "#{user.role}"
. 只需确保具有名称为 admin.html.erb' 等的相应视图。
您可以做几件事,但没有什么是内置的,也没有什么比send("#{user.role}_url")
. 请务必使用 send() - 否则它将重定向到 URL“/admin_url”,而不是调用 admin_url 帮助程序。
另一个这样的解决方案是创建一个名为“home”的操作,该操作将重定向到 current_user 的角色页面。这会增加一个额外的重定向(稍微增加页面加载时间),但它会使你的重定向更简单
redirect_to home_url
我真的很喜欢安德鲁的回答,但你也可以做类似的事情
redirect_to send(user.role.to_s + '_url')