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
类设计器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