我需要为经过身份验证和未经身份验证的用户提供“联系”链接,以便将其发送给
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
这非常有效,但我很好奇,是否有人遇到过更优雅的解决方案?
答案 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
方法之上实现的,但它可以很容易地适应其他身份验证设置。