Ruby on rails 从不同的表单和控制器创建Desive用户-Ruby on Rails

Ruby on rails 从不同的表单和控制器创建Desive用户-Ruby on Rails,ruby-on-rails,model-view-controller,devise,Ruby On Rails,Model View Controller,Devise,我们有两个模型,“设计用户”和“影响者”。影响者是一个用户,因此它必须有一个用户(从数据库的角度)。一个用户可以是多个其他东西。因此,我们希望能够注册一个用户而不成为一个影响者,并且当用户想要注册成为一个影响者时,我们希望注册一个用户 我有一张这样的表格: influencers/new.html.erb <%= form_for @influencer do |i| %> <%= i.fields_for(resource, as: resource_name, url:

我们有两个模型,“设计用户”和“影响者”。影响者是一个用户,因此它必须有一个用户(从数据库的角度)。一个用户可以是多个其他东西。因此,我们希望能够注册一个用户而不成为一个影响者,并且当用户想要注册成为一个影响者时,我们希望注册一个用户

我有一张这样的表格:

influencers/new.html.erb

<%= form_for @influencer do |i| %>
  <%= i.fields_for(resource, as: resource_name, url: registration_path(resource_name)) do |u| %>
    <div id="registration_fields">
      <%= render 'devise/registrations/registration_fields', f: u %>
    </div>
  <% end %>

<div class='field'>
  <%= i.label :twitter_handle %><br/>
  <%= i.text_field :twitter_handle %>
</div>

<div class='field'>
  <%= i.label :short_bio %><br/>
  <%= i.text_area :short_bio %>
</div>
我们已经修改了ApplicationHelper和“new”方法,以便它可以毫无问题地呈现这个设计表单。不幸的是,我们被困于如何正确地为我们的影响者控制器创建“create”方法

这是我们收到的哈希:

Parameters: {..., "influencer"=>{"user"=>{"first_name"=>"buddy", "last_name"=>"king", "email"=>"bdking@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "twitter_handle"=>"@bdking", "short_bio"=>"None"}, "commit"=>"Join as influencer"
本质上,我们希望设计在处理影响者信息的同时处理用户信息。我们已尝试从InfluencesController#create中调用designe::RegistrationsController.new.create方法。然而,这也带来了自身的困难(即使有多个黑客攻击,我们也会遇到不同的问题,例如缺少“@response”或“response.env”或缺少“designe.mappings”)

话虽如此,我们相信继承将允许我们在create函数中调用“super”。但是,我们不希望让InfluencesController从DeVICE::RegistrationController继承,因为此控制器无论如何都不是真正的DeVICE控制器


我们有什么办法可以绕过这个问题吗?

我会使用经过验证的
用户
角色
模式

基本上,您的
用户
类负责身份验证(identity),用户有许多
角色
,可用于授权(权限)


我会使用久经考验的
用户模式
角色模式

基本上,您的
用户
类负责身份验证(identity),用户有许多
角色
,可用于授权(权限)


如果你必须的话,你可以使用STI或MTI。但就复杂性和性能而言,缺点是相当大的。什么是STI或MTI?您是对的,我们使用的是用户角色,其中一个是影响者。但是,由于影响者有额外的数据成员,我们为他们创建了自己的表。我想问的是,是否有一种方法可以让影响者控制器注册一个用户,而不必从Desive::RegistrationsController.Single Table继承和Multiple Table继承继承。是的,你可以从头开始创建一个注册用户的控制器-它与任何其他CRUD控制器没有太大区别,只是你调用
sign_in@user
,让Warden在重定向之前将id存储在会话中。如果你必须这样做,你可以使用STI或MTI。但就复杂性和性能而言,缺点是相当大的。什么是STI或MTI?您是对的,我们使用的是用户角色,其中一个是影响者。但是,由于影响者有额外的数据成员,我们为他们创建了自己的表。我想问的是,是否有一种方法可以让影响者控制器注册一个用户,而不必从Desive::RegistrationsController.Single Table继承和Multiple Table继承继承。是的,您可以从头开始创建一个注册用户的控制器-它与任何其他CRUD控制器没有太大区别,只是您在@user中调用
sign_,让Warden在重定向之前将id存储在会话中。
Parameters: {..., "influencer"=>{"user"=>{"first_name"=>"buddy", "last_name"=>"king", "email"=>"bdking@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "twitter_handle"=>"@bdking", "short_bio"=>"None"}, "commit"=>"Join as influencer"
class User < ActiveRecord::Base
  has_many :roles

  def has_role?(role)
    roles.where(name: role)
  end
end

class Role < ActiveRecord::Base
  belongs_to :user
  validates_uniqueness_of :name, scope: :user_id
end
class InfluencerRegistrationsController < Devise::RegistrationsController

  def resource_class
    User
  end

  def build_resource
    super
    self.resource.roles.new(name: :influencer)
  end
end