当用户可能没有登录时,如何链接到嵌套在用户下的资源?

时间:2011-10-14 11:54:32

标签: ruby-on-rails devise

我需要为经过身份验证和未经身份验证的用户提供“联系”链接,以便将其发送给

new_user_widget_path(current_user)

当然,这对于未经身份验证的用户不起作用,因为没有当前用户。我用来解决这个问题的方法是有两条路线:

resources :widgets, only: :new
resources :users do
  resources :widgets
end

第一条路线的唯一目的是在未经身份验证的情况下提供重定向,然后在登录后将该用户重定向到新的小部件页面。

class WidgetsController < ApplicationController
  before_filter :authenticate_user!

  def new
    redirect_to new_user_widget_path(current_user)
  end
end

这非常有效,但我很好奇,是否有人遇到过更优雅的解决方案?

2 个答案:

答案 0 :(得分:1)

我认为你的做法没有什么特别的错误。另一种方法是拥有访客用户。在我的应用程序中,如果用户请求需要身份验证的页面,我会将其重定向到登录页面,然后将其重定向到他们登录后尝试访问的页面。如果您有这样的系统,则可以检查如果guest ID在完整路径中并将其替换为现在登录的current_user id。

答案 1 :(得分:1)

用户未登录,但您需要正确的重定向。在视图中,您可以执行此操作:

new_user_widget_path(current_user || "_")

然后将其添加到application_controller.rb

    def stored_location_for(resource_or_scope)
      if path = super
        prefix = polymorphic_path(current_user.class)
        path.gsub!("#{prefix}/_", "#{prefix}/#{current_user.id}")
      end
    end

用正确的ID替换下划线。

这是在Devise的stored_location_for方法之上实现的,但它可以很容易地适应其他身份验证设置。