Rails:redirect_to '#{user.role}_url'如何做到这一点?



有没有办法在rails/ruby中简化我的路由代码,使其变得优雅,例如:

redirect_to user.role + _url

这样,如果用户是管理员,他们将被路由到管理员页面,依此类推其他用户类型...

当然!

redirect_to send("#{user.role}_url")

在 Ruby 中,发送将在接收器上执行该方法,这正是您想要的。通常,这看起来像:

@receiver_object.send(:admin_url)

但是 url 帮助程序在全局命名空间中工作,因此您可以发送到全局并使其工作。

简单的测试方法:将其添加到控制器并观察它将您重定向回家:

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"什么都不做,它只是一个毫无意义的字符串,重定向期望字符串是一个 URL。

如果您计算字符串,它将起作用,因为redirect_to eval("#{user.role}_url")将首先将"admin_url"转换为调用 admin_url 方法,该方法返回一些路径,例如 users/admin ,并且该字符串可由重定向方法使用。

您可以使用render "#{user.role}" .只要确保有相应的视图,名称为admin.html.erb'等。

我真的很喜欢安德鲁的回答,但你也可以做类似的事情

redirect_to send(user.role.to_s + '_url')

您可以做几件事,但没有内置的东西,也没有比send("#{user.role}_url")更简单的事情。请务必使用 send() - 否则它将重定向到 URL "/admin_url",而不是调用admin_url帮助程序。

另一种解决方案是创建一个名为"home"的操作,该操作将重定向到current_user角色的页面。这将增加一个额外的重定向(略微增加页面加载时间),但它会使你的重定向更简单

redirect_to home_url

最新更新