【问题标题】:Devise and current_user issue when using namespace使用命名空间时的设计和 current_user 问题
【发布时间】:2011-12-31 09:15:57
【问题描述】:

在核心网站上,我使用标准的 Devise 配置进行用户身份验证。在 routes.rb 中:

devise_for :users

现在,我有一个命名空间,我们称之为“框架”,用于通过远程页面上的小窗口(或 iframe)中的一些控制器显示一些视图。 我需要在框架内对用户进行身份验证,因此我嵌套了 devise_for 声明:

namespace :frame do
  devise_for :users
  resources :albums, :only => :show do
    resources :photos, :only => [:new, :create, :show]
  end
end

为了使整个工作正常进行,我需要创建适当的控制器:

class Frame::SessionsController < ::Devise::SessionsController
  layout "frame"
end

现在我使用以下路径显示表单:

new_frame_user_session_path

但是。当我通过框架登录时,*current_user* 为 nil,而我有 *current_frame_user*。这很糟糕,因为通过核心网站 (*current_user*) 登录的用户应该可以通过框架和反向访问(在一个浏览器中)。

是否有一些调整可以实现它,或者我应该改变整个方法?谢谢你的帮助。

【问题讨论】:

  • 我怀疑 Rails 会将 iframe 和周围的页面视为两个不同的浏览器,因此您将无法从框架访问页面的current_user,反之亦然。不过只是预感。
  • 实际上 iframe 在此任务中与我无关(我使用通过 javascript 打开的窗口)。当我登录核心站点时,可以在该窗口中访问 c​​urrent_user。
  • 为什么首先要添加命名空间?如果您只想拥有一个不同的 URL,则可以在 devise_for 调用中添加路径选项...您可以通过将控制器选项添加到 devise_for 来将控制器保存在单独的命名空间中。
  • 我需要为常规登录和 framed 登录提供完全分离的布局,并将所有内容(包括会话)放入命名空间似乎对我有帮助。

标签: ruby-on-rails session namespaces devise


【解决方案1】:

解决方案是我在 views/frame/sessions/new.html.haml 中更改登录表单。

代替:

= simple_form_for resource, :as => resource_name, :url => session_path(resource_name) do |f|

我需要覆盖资源名称:

= simple_form_for resource, :as => :user, :url => session_path(:user) do |f|

现在我可以在框架内登录,并且用户的会话在框架和网站的其余部分之间是一致的。

【讨论】:

  • 你拯救了我的一天!谢谢老兄
  • 我没有看到登录系统和 current_user 定义本身之间的联系,你确定你只是这样做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多