如何使用路由别名改进重定向

时间:2012-08-16 05:46:41

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

我正在使用设计应用程序,我不喜欢我的应用程序在成功登录后重定向的方式。这是rake routes的输出:

   manager_root GET    /managers/dashboard(.:format)      managers#dashboard
   student_root GET    /students/dashboard(.:format)      students#dashboard
enterprise_root GET    /enterprises/dashboard(.:format)   enterprises#dashboard

到目前为止我有什么

def after_sign_in_path_for(resource)               
  "/#{current_user.profile_type.pluralize}/dashboard"
end

我尝试了什么

def after_sign_in_path_for(resource)               
  "#{current_user.profile_type}"_root_path
end
#=> application_controller.rb:17: syntax error, unexpected tIDENTIFIER, expecting keyword_end

def after_sign_in_path_for(resource)               
  "#{current_user.profile_type}_root_path"
end
#=> ERROR URI::InvalidURIError: the scheme http does not accept registry part:localhost:3000enterprise_root_path (or bad hostname?)

注意

  • 我只有一个名为User的设计模型,它有一个名为profile_type的列,其值可以是'enterprise''student'或{{1} }。

  • 我只是想使用我的路线别名。

  • 我到目前为止所做的工作只是想改进它。

3 个答案:

答案 0 :(得分:3)

我认为这应该适合你:

def after_sign_in_path_for(resource)               
  polymorphic_url([current_user.profile_type, :root])
end

答案 1 :(得分:3)

通过nash的回答,我搜索了一个更好的多态性用法并做出了我自己的答案。

这是获取帖子评论和新闻'评论

的网址的常用方法
# parent may be a post or a news
if Post === parent
  post_comments_path(parent)
elsif News === parent
  news_comments_path(parent)
end

Rails提供了一种生成polymorphic url的简单方法。我们可以使用polymorphic_path获取postnews'评论的网址

# "/posts/1/comments" or "'news/1/comments"
polymorphic_path([parent, Comment])

这可以获得帖子和新闻的网址

# "http://example.com/posts/1/comments" or "http://example.com/news/1/comments"
polymorphic_path(parent)

polymorphic_path使多态url生成更容易,更简单。还有一个名为polymorphic_url的方法与polymorphic_path相同,只是polymorphic_url生成包含主机名的完整网址。

除此之外,rails还为polymorphic_path/polymorphic_url

提供了新的编辑操作
new_polymorphic_path(Post)    # "/posts/new"
new_polymorphic_url(Post)     # "http://example.com/posts/new"
edit_polymorphic_path(post)   # "/posts/1/edit"
edit_polymorphic_url(post)    # "http://example.com/posts/1/edit"

就我而言,我只是

def after_sign_in_path_for(resource)
  polymorphic_path [current_user.profile_type, :root]
end

答案 2 :(得分:0)

试试这个

def after_sign_in_path_for(resource)               
  send("#{current_user.profile_type}_root_path")
end