从设计覆盖注册控制器时,是否可以在创建操作上访问新创建的用户?

Spl*_*nia 4 ruby ruby-on-rails mkdir devise ruby-on-rails-3

我正在尝试在用户注册后立即创建一个文件夹,所以我覆盖了注册控制器上的创建操作(设计),但我不知道如何访问新创建的用户以创建具有其名称的文件夹稍后上传文件.

到目前为止,我有这个:

class RegistrationsController < Devise::RegistrationsController

  def new
    super
  end

  def create
    super
    create_folder
  end

  def update
    super
  end

  def create_folder
    path =  Pathname.new(':rails_root/tmp/')
    directory_name = ":current_user"
    Dir.mkdir(path, directory_name) unless File.exists?(directory_name)
  end
end
Run Code Online (Sandbox Code Playgroud)

的routes.rb

 devise_for :users, :controllers => {:registrations => "registrations"}
Run Code Online (Sandbox Code Playgroud)

我按照这个来覆盖注册控制器.

  1. 我应该把它留在那里还是将它移到创建动作中?而不是使用方法
  2. 是访问当前用户的正确方法吗?
  3. 也许不是注册而是在登录时做得更好?

我很感激我能得到任何帮助.

zea*_*soi 5

您应该真正在动作中完成此功能after_filter,而不是在动作本身中:

class RegistrationsController < Devise::RegistrationsController
  after_filter :create_folder, :only => :create

  protected

  def create_folder
    path =  Pathname.new(Rails.root.to_s + '/tmp/') #=> Note 1
    directory_name = resource.id.to_s                #=> Note 2
    Dir.mkdir(path + directory_name)                #=> Note 3
  end
end
Run Code Online (Sandbox Code Playgroud)

备注:

  1. 检索项目根目录的语法不正确.:rails_root无法从单引号内插入 - 并且它不存在,无论如何.试试吧Rails.root.to_s.
  2. ":current_user"只是一个字符串,它将尝试命名目录:current_user,既不是动态的也不是有效的.因为您的Devise控制器可以访问当前resource(在本例中代表current_user),所以请检索resource.id并使用它.
  3. 连接pathdirectory_name连接+,而不是,.不需要unless条件,因为您可能只在创建新用户时创建新文件夹,并且每个用户都具有唯一性id.