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

时间:2012-05-02 02:32:21

标签: ruby-on-rails ruby ruby-on-rails-3

有没有办法在rails / ruby​​中简化我的路由代码,如:

redirect_to user.role + _url

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

5 个答案:

答案 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')