在Rails中设计gem:生成user_root_path

时间:2011-01-20 23:07:55

标签: ruby-on-rails devise

尝试在成功登录后将用户重定向到关联的“主页”页面w / out nil'ing stored_location_for(resource_or_scope) ...这给了我一些无限的重定向循环(很确定我已设置它错了)

无论如何,我正在寻找更好的方法......

  

Devise's docs状态:之后   登录用户,确认   帐户或更新密码,   设计将寻找一个范围的根   重定向的路径。示例:对于a   它将使用:user资源   user_root_path如果存在,   否则默认为root_path   用过的。这意味着您需要设置   您的路线中的根:root :to => "home"

我是一个新手...如何为每个用户生成这个home_root_path

rDocs also mention

  

- (对象) after_sign_in_path_for (resource_or_scope)

     

之后要使用的默认网址   登录。这是所有Devise使用的   控制器,你可以覆盖它   在你的ApplicationController中   为自定义提供自定义挂钩   资源。        默认情况下,它首先尝试查找resource_root_path,否则   它使用根路径。对于用户   范围,您可以定义默认网址   通过以下方式:

 map.user_root '/users', :controller => 'users' # creates user_root_path

 map.namespace :user do |user|
   user.root :controller => 'users' # creates user_root_path
 end

但是这些只为#ActionDispatch :: Routing :: Mapper:...`错误提供了undefined local variable or method map'。

5 个答案:

答案 0 :(得分:22)

如果您想使用路线重定向以回答以下问题:

  

如何为每个用户生成此home_root_path?

如果将它放在config / routes文件中,这将有效。在(例如)成功确认后,它会将用户重定向到文章#index。

    match 'user_root' => 'articles#index', as: :user_root

答案 1 :(得分:6)

您可以尝试这样的事情:

application_controller.rb:

def after_sign_in_path_for(resource_or_scope)
  # return home_page_path for user using current_user method
end

答案 2 :(得分:6)

挖了一下以找出同样的事情。 @ polarblau的回答是正确的,

def after_sign_in_path_for(resource_or_scope)
  user_info_path(current_user)
end

其中user_info_path是您要显示的页面的路径。

另外,为了以防万一,我会允许这回到超级,虽然我不完全确定是否有必要......

def after_sign_in_path_for(resource)
  if resource.is_a(User)
    user_info_path(resource)
  else
    super
  end
end

答案 3 :(得分:1)

我花了几个小时试图获得相同的功能,这就是最终为我工作的代码:

def after_sign_in_path_for(resource)
    current_user
end

如果我曾尝试current_user_path,我总是会遇到undefined local variable or method current_user_path错误。

另外,我正在使用Rails 3.2.8和Devise 2.1.2。

希望有所帮助。

答案 4 :(得分:1)

根据@SnapShot的回答,这对我有用。我使用多个设计模型,尝试重定向回用户个人资料编辑页面。

  get 'user_root', to: redirect('/users/edit'), as: :user_root