2016-12-20 2 views
0

Ich verwende einfache Form und Devise.Wie erstelle ich einen neuen Datensatz in einer Assoziation in einem von Devise verwalteten Modell mit Simple Form?

Auf meinem registrations/edit.html.erb, ich habe folgendes:

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put, class: "edit-user-form m-t" }) do |f| %> 
     <%= f.file_field :avatar, class: 'col-lg-4 form-control' %> 

     <%= f.input_field :email, required: true, autofocus: true %> 
     <%= f.input_field :current_password, hint: "we need your current password to confirm your changes", placeholder: "current password", required: true %> 

    <h3 class="text-center">Change Password</h3> 
     <%= f.input_field :password, autocomplete: "off", hint: "leave it blank if you don't want to change it", placeholder: "new password", required: false %> 
     <%= f.input_field :password_confirmation, placeholder: "confirm new password", required: false %> 

     <h3 class="text-center">School</h3> 

      <%= f.association :school, collection: School.where(school_type: [:college, :university]), prompt: "Choose a school", class: 'col-lg-4 form-control', label: false %> 

     <div class="alert alert-warning col-lg-offset-1 col-lg-10 text-center"> 
      <p>NB: If you can't find your school in the list above, please add it in the field below.</p> 
     <%#= f.input_field some_random_field_that_collects_this_school_name %> 
     </div> 

     <%= f.button :submit, "Update", class: "btn btn-lg edit-account-update-button" %> 

<% end %> 

Was ich tun möchte, ist, wenn die Schule für den Benutzer derzeit nicht in unsere DB, ich möchte, dass sie den Namen ihrer Schule unterbreiten.

Dies ist das DB-Schema für School.rb:

# == Schema Information 
# 
# Table name: schools 
# 
# id     :integer   not null, primary key 
# name     :string 
# school_type   :integer 
# created_at   :datetime   not null 
# updated_at   :datetime   not null 

Wo school_type ist ein ENUM-Wert:

enum school_type: { high_school: 0, college: 1, university: 2 } 

Was ist der beste Weg, dies zu erreichen?

Antwort

1

Wenn Sie die school on the fly bei der Registrierung erstellen möchten, lassen Sie Ihren user (oder was auch immer Sie Einstecken in devise) verschachtelte Attribute für eine school zu akzeptieren.

# app/models/user.rb 
class User < ActiveRecord::Base 
    accepts_nested_attributes_for :school, reject_if: :school_exists 

    def school_exists(attributes) 
    !School.where(name: attributes['name'], school_type: attributes['school_type']).empty? 
    end 
end 

# app/controllers/user.rb 
def new 
    @user = User.new 
    @user.build_school 
end  

# app/views/devise/registrations/edit.html.erb 
... 
<p>NB: If you can't find your school in the list above, please add it in the field below.</p> 
<%= f.simple_fields_for :school do |s| %> 
    <%= s.input :name %> 
    <%= s.input :school_type, :collection => %w[high_school college university] %> 
<% end %> 
... 

Wenn Sie starke Parameter verwenden, nicht zu vergessen die user_params Methode in der userController zu aktualisieren, um explizit diese Parameter zu ermöglichen.

Hilfreiche Informationen:

+1

Sie könnten 'reject_if verwenden möchten: existing_school' mit' accepts_nested_attributes_for' so dass keine doppelten Schulen versehentlich erstellt werden. (Sie müssen natürlich Ihre eigene 'existing_school' Methode schreiben) – EJ2015

+0

@ EJ2015 Guter Anruf! Bearbeitet um hinzuzufügen. – anyarms

+0

Da ich Devise verwende, kann ich das einfach in meinem 'registrations_controller # edit' anstatt in meinem' users_controller # edit' tun? Ich habe eigentlich keinen 'user_controller', aber ich habe einen' RegistrationsController'. Deshalb frage ich. – marcamillion

Verwandte Themen