Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从Rails中的注册表单创建Desive用户时,如何创建另一个对象?_Ruby On Rails_Ruby On Rails 3_Devise_Ruby On Rails 3.2_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 从Rails中的注册表单创建Desive用户时,如何创建另一个对象?

Ruby on rails 从Rails中的注册表单创建Desive用户时,如何创建另一个对象?,ruby-on-rails,ruby-on-rails-3,devise,ruby-on-rails-3.2,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 3,Devise,Ruby On Rails 3.2,Ruby On Rails 4,我的系统中有不同类型的用户。比如说,一种是设计师: class Designer < ActiveRecord::Base attr_accessible :user_id, :portfolio_id, :some_designer_specific_field belongs_to :user belongs_to :portfolio end 类设计器

我的系统中有不同类型的用户。比如说,一种是设计师:

class Designer < ActiveRecord::Base
  attr_accessible :user_id, :portfolio_id, :some_designer_specific_field
  belongs_to :user
  belongs_to :portfolio
end
类设计器 在用户注册时立即创建。因此,当用户填写注册表单时,一个designe
user
将与此
Designer
对象一起创建,其
user\u id
设置为创建的新
user
。如果我能访问控制器的代码,那就很容易了。但使用Desive,我无法访问此注册控制器

# config/routes.rb
# Signups
get 'signup' => 'signups#new',     as: :new_signup
post 'signup' => 'signups#create', as: :signups  


# app/controllers/signups_controller.rb
class SignupsController < ApplicationController
  def new
    @signup = Signup.new
  end

  def create
    @signup = Signup.new(params[:signup])

    if @signup.save
      sign_in @signup.user
      redirect_to projects_path, notice: 'You signed up successfully.'
    else
      render action: :new
    end
  end
end

注册后创建
用户
设计师
的正确方法是什么?

在最近的一个项目中,我使用了一步创建了设计用户和公司。这涉及绕过Desive的RegistrationController并创建您自己的SignupController

# config/routes.rb
# Signups
get 'signup' => 'signups#new',     as: :new_signup
post 'signup' => 'signups#create', as: :signups  


# app/controllers/signups_controller.rb
class SignupsController < ApplicationController
  def new
    @signup = Signup.new
  end

  def create
    @signup = Signup.new(params[:signup])

    if @signup.save
      sign_in @signup.user
      redirect_to projects_path, notice: 'You signed up successfully.'
    else
      render action: :new
    end
  end
end
对表单对象(以及我的工作来源)的一个极好的阅读是

总之,与使用
接受
的嵌套属性相比,我更喜欢这种方法,尽管可能有更好的方法。如果你找到了,请告诉我

===

编辑:添加参考模型及其关联,以便更好地理解

class用户true}
有很多:非管理员,通过::成员身份,
来源::用户,
条件:{'memberships.admin'=>false}
结束

模型中的这种结构与thoughtbot的gem一起建模。源代码不在Github AFAIK上,但可以从gem中提取。通过重新构建它,我学到了很多东西。

如果不想更改注册控制器,一种方法是使用ActiveRecord回调

class User < ActiveRecord::Base
  after_create :create_designer

  private

  def create_designer
      Designer.create(user_id: self.id) 
  end
end
class用户
回调不起作用,因为我没有访问params散列的权限。假设帐户、用户和成员都有activerecord模型,我们如何将其持久化到数据库中。您介意发布表单本身的外观以及该控制器的activerecord模型吗。谢谢。添加了模型结构。持久化由控制器中调用的
@signup.save
处理,它创建所有对象及其关联。
class User < ActiveRecord::Base
  after_create :create_designer

  private

  def create_designer
      Designer.create(user_id: self.id) 
  end
end