1

この投稿で Vampire のソリューションに従っていますが、関連する子クラスを持つ新しいユーザーを作成する際に問題が発生しています。

私は、学生と編集者の 2 つの子クラスへのポリモーフィックな関連付けを持つユーザー モデルを持っています。新規ユーザー登録にも独自のコントローラーがあります。フォームに入力すると、電子メールとパスワードを空白にすることはできませんが、空白にすることはできないというエラーが表示されます。2 つの可能な子クラスのいずれかから属性を受け入れるように create メソッドを作成するにはどうすればよいですか。

エディタ モデル

require 'carrierwave/orm/activerecord'
class Editor < ActiveRecord::Base

  has_one :user, :as => :rolable
  belongs_to :school
  mount_uploader :image, ImageUploader
end

ユーザーモデル(ここでネストされた属性を受け入れるかどうかを使用する必要があるかどうかはわかりません)

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable

  belongs_to :rolable, :polymorphic => true
  has_many :editors
  has_many :students 
  accepts_nested_attributes_for :editors  
  accepts_nested_attributes_for :students

  #has_many :applications 
  #has_many :editors, :through => :applications
  #has_and_belongs_to_many :schools 
end

新規ユーザーフォーム

<center>
<div class="hero-unit">
<h2>Sign up</h2>

<% params[:user][:user_type] ||= 'student'

  if ["student", "editor"].include? params[:user][:user_type].downcase
    child_class_name = params[:user][:user_type].downcase.camelize
    user_type = params[:user][:user_type].downcase
  else
    child_class_name = "Student"
    user_type = "student"
  end

  resource.rolable = child_class_name.constantize.new if resource.rolable.nil?

%>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
 <%= my_devise_error_messages! %>


  <div><%= f.label :email %><br />
  <%= f.email_field :email %></div>

  <div><%= f.label :password %><br />
  <%= f.password_field :password %></div>

  <div><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></div>


  <%= fields_for resource.rolable do |rf| %>
    <% render :partial => "#{child_class_name.underscore}_fields", :locals => { :f => rf } %>
  <% end %>

  <%= hidden_field :user, :user_type, :value => user_type %>


  <div><%= f.submit "Sign up" %></div>
<% end %>

<%= render :partial => "devise/shared/links" %>
</div>
</center>

ユーザー登録コントローラー

class UserRegistrationsController < Devise::RegistrationsController
  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation,) 
  end


  def new
    super
  end

  def update
    super
  end

  def edit
    super
  end

  def destroy
    super
  end 

  def create

    # Building the user, I assume.
    build_resource

    # crate a new child instance depending on the given user type
    child_class = params[:user][:user_type].camelize.constantize
    resource.rolable = child_class.new(user_params[child_class.to_s.underscore.to_sym])

    # first check if child instance is valid
    # cause if so and the parent instance is valid as well
    # it's all being saved at once
    valid = resource.valid?
    valid = resource.rolable.valid? && valid

    # customized code end

    if valid && resource.save    # customized code
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_in(resource_name, resource)
        respond_with resource, :location => redirect_location(resource_name, resource)
      else
        set_flash_message :notice, :inactive_signed_up, :reason => inactive_reason(resource) if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords(resource)
      respond_with_navigational(resource) { render :new }

    end

  end
end
4

1 に答える 1

1

デフォルト作成

# Building the user, I assume.
build_resource (**sign_up_params**)

sign_up_params がありません

于 2014-05-15T13:58:38.280 に答える