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