web-dev-qa-db-de.com

Geräteregistrierungs-Controller überschreiben

Ich habe dem Anmeldeformular ein Feld hinzugefügt, das auf einem anderen Modell basiert, siehe Wie verwende ich verschachtelte Attribute mit dem Gerätemodell? für die genauen Details. Dieser Teil funktioniert gut.

Das Problem besteht nun darin, dass beim Speichern die Erstellungsaktion des Registrations-Controllers, der von devise mit einem Activerecord::UnknownAttributeError In diesem Feld (Firma) geliefert wird, fehlschlägt.

Ich gehe davon aus, dass ich den Registrations Controller überschreiben muss, oder gibt es einen besseren/einfacheren Weg, wie ich das angehen sollte?

230
Craig McGuff

Übergeben Sie in Ihrem Formular andere Attribute über Massenzuweisungen, die nicht zu Ihrem Benutzermodell gehören, oder eines der verschachtelten Modelle?

Wenn ja, glaube ich, dass der ActiveRecord :: UnknownAttributeError in dieser Instanz ausgelöst wird.

Ansonsten, denke ich, können Sie einfach Ihren eigenen Controller erstellen, indem Sie so etwas generieren:

# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  def new
    super
  end

  def create
    # add custom create logic here
  end

  def update
    super
  end
end 

Und dann teilen Sie devise mit, dass dieser Controller anstelle des Standardcontrollers verwendet werden soll:

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
350
theTRON

Eine bessere und besser organisierte Methode zum Überschreiben von Devise-Controllern und -Ansichten mithilfe von Namespaces:

Erstellen Sie die folgenden Ordner:

app/controllers/my_devise
app/views/my_devise

Fügen Sie alle Controller, die Sie überschreiben möchten, in app/controller/my_devise ein und fügen Sie den Controller-Klassennamen den Namespace MyDevise hinzu. Registrations Beispiel:

# app/controllers/my_devise/registrations_controller.rb
class MyDevise::RegistrationsController < Devise::RegistrationsController

  ...

  def create
    # add custom create logic here
  end

  ...    

end 

Ändern Sie Ihre Routen entsprechend:

devise_for :users,
           :controllers  => {
             :registrations => 'my_devise/registrations',
             # ...
           }

Kopieren Sie alle erforderlichen Ansichten aus dem Devise Gem-Ordner in app/views/my_devise Oder verwenden Sie Rails generate devise:views, Löschen Sie die Ansichten, die Sie nicht überschreiben, und benennen Sie den Ordner devise in my_devise Um.

Auf diese Weise haben Sie alles ordentlich in zwei Ordnern organisiert.

66
Vincent

Ich glaube, es gibt eine bessere Lösung als den RegistrationsController neu zu schreiben. Ich habe genau das Gleiche getan (ich habe nur Organisation statt Firma).

Wenn Sie Ihr verschachteltes Formular auf Modell- und Ansichtsebene richtig einstellen, funktioniert alles wie ein Zauber.

Mein Benutzermodell:

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

  has_many :owned_organizations, :class_name => 'Organization', :foreign_key => :owner_id

  has_many :organization_memberships
  has_many :organizations, :through => :organization_memberships

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :username, :owned_organizations_attributes

  accepts_nested_attributes_for :owned_organizations
  ...
end

Mein Organisationsmodell:

class Organization < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User'
  has_many :organization_memberships
  has_many :users, :through => :organization_memberships
  has_many :contracts

  attr_accessor :plan_name

  after_create :set_owner_membership, :set_contract
  ...
end

Meine Sichtweise: 'devise/registrations/new.html.erb'

<h2>Sign up</h2>

<% resource.owned_organizations.build if resource.owned_organizations.empty? %>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <p><%= f.label :name %><br />
    <%= f.text_field :name %></p>

  <p><%= f.label :email %><br />
    <%= f.text_field :email %></p>

  <p><%= f.label :username %><br />
    <%= f.text_field :username %></p>

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

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

  <%= f.fields_for :owned_organizations do |organization_form| %>

    <p><%= organization_form.label :name %><br />
      <%= organization_form.text_field :name %></p>

    <p><%= organization_form.label :subdomain %><br />
      <%= organization_form.text_field :subdomain %></p>

    <%= organization_form.hidden_field :plan_name, :value => params[:plan] %>

  <% end %>

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

<%= render :partial => "devise/shared/links" %>
33
thb

Sie können Ansichten und Controller für die benutzerdefinierte Anpassung generieren.

Verwenden

Rails g devise:controllers users -c=registrations

und

Rails g devise:views 

Es kopiert bestimmte Controller und Ansichten von Gem in Ihre Anwendung.

Weisen Sie den Router als Nächstes an, diesen Controller zu verwenden:

devise_for :users, :controllers => {:registrations => "users/registrations"}
11
user1201917

Sehr einfache Methoden Gehen Sie einfach zum Terminal und geben Sie Folgendes ein

Rails g devise:controllers users //This will create devise controllers in controllers/users folder

Klicken Sie auf Weiter, um benutzerdefinierte Ansichten zu verwenden

Rails g devise:views users //This will create devise views in views/users folder

jetzt in deiner route.rb datei

devise_for :users, controllers: {
           :sessions => "users/sessions",
           :registrations => "users/registrations" }

Sie können auch andere Controller hinzufügen. Dadurch werden Controller im Benutzerordner und Ansichten im Benutzerordner verwendet.

Jetzt können Sie Ihre Ansichten nach Ihren Wünschen anpassen und Ihre Logik zu Controllern im Ordner controller/users hinzufügen. Genießen !

10
Pradeep Sapkota

erstellen Sie die Controller-Registrierungen und überschreiben Sie die geerbte Klasse mit der vordefinierten Devise :: RegistrationsController-Klasse

# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  def new
    super
  end

  def create
    # add custom create logic here
  end

  def update
    super
  end
end 

danach Routen setzen nach:

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
0