0

Ich mache eine Website für eine bestehende Datenbank. Diese Datenbank stammt aus einem Spiel und ich kann in den vorhandenen Tabellen nicht viele Änderungen vornehmen.Rails 5 mit Devise - Devise Benutzer has_one Login

Ich entschied mich, Devise als Authentifizierungslösung zu verwenden. Ich werde das User-Modell von Devise für die Website verwenden und die Datenbank hat eine Login-Tabelle mit einigen wichtigen Informationen.

Sie werden eine Eins-zu-eins-Zuordnung haben, wobei der Benutzer has_one ein Login hat und der Login dem Benutzer gehört.

Ich habe das Benutzerregistrierungsformular geändert, um einige Anmeldeinformationen zu erhalten. Ich habe dafür eine verschachtelte Form benutzt. Wenn ich mich anmelde, sollte ich den Benutzer und das Login erstellen.

Ich versuche dieses create part, aber es funktioniert nicht. Ich habe viele verschiedene Möglichkeiten ausprobiert, aber es funktioniert nie. Die beiden Hauptprobleme sind:

  1. den Benutzer erstellt, aber nicht schafft die Login
  2. es schafft beide aber die Anmeldung nicht die Informationen haben, die ich in der Form, . Sie sind alle leer

ich viele verschiedene Arten versucht:

  • überschreiben die neue Methode in der RegistrationController mit resource.build_login
  • Überschreibung sign_up_params Methode mit Genehmigung innerhalb
  • die resource.build_login setzen in der neuen Ansicht
  • überschreiben build_resource und setzen resource.build_login dort

Keine von ihnen funktioniert.

Ich verwende Rails 5.0.2 und Devise 4.2.0.

Dies sind die Modelle:

class Login < ApplicationRecord 
    belongs_to :user 
    # accepts_nested_attributes_for :user 
end 

class User < ApplicationRecord 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_one :login 
    # accepts_nested_attributes_for :login 
end 

Eine wichtige Frage ist, wo soll ich die accepts_nested_attributes_for setzen? Ich habe Leute gesehen, die es im Model benutzt haben, und ich habe auch Leute gesehen, die im has_one-Modell benutzt haben.

Das ist mein RegistrationController:

class Users::RegistrationsController < Devise::RegistrationsController 
    def new 
    super 
    resource.build_login 
    end 
    def create 
    super 
    end 
    def sign_up_params 
    params.require(resource_name).permit(:email, :password, 
        :password_confirmation, login_attributes: 
        [:userid, :birthdate, :sex]) 
    end 
end 

Und das ist meine Ansicht:

<%= simple_form_for(resource, as: resource_name, url: 
        registration_path(resource_name)) do |f| %> 
    <%= f.error_notification %> 
    <%= f.input :email, required: true, autofocus: true, class: 'form- 
       control' %> 
    <%= f.input :password, required: true, hint: ("No mínimo # 
       {@minimum_password_length} caracteres" if 
       @minimum_password_length) %> 
    <%= f.input :password_confirmation, required: true %> 
    <%= f.simple_fields_for :login do |ff| %> 
    <%= ff.input :userid %> 
    <%= ff.input :birthdate %> 
    <%= ff.label :sex %> 
    <%= ff.input_field :sex, collection: [['Feminino', 'F'], 
       ['Masculino', 'M']], class: 'form-control' %> 
    <% end %> 
    <%= f.button :submit, 'Cadastrar', class: 'btn btn-primary' %> 
<% end %> 

Ich hoffe, dass alle erforderlichen Informationen, um dort sind.

Die meisten Antworten, die ich für dieses Problem gefunden wurden 4 oder Rails Rails 3 und vielleicht haben sie für mich nicht, weil ich Rails bin 5.

Edit # 1: Added create-Methode in RegistrationController .

Edit # 2: Mit accepts_nested_attributes_for in Benutzer die Felder nicht erscheint, so änderte ich accepts_nested_attributes_for Modell anmelden.

Und hier ist das Protokoll, wie der Code ist jetzt:

Started POST "/users" for 127.0.0.1 at 2017-07-14 20:24:40 -0300 
Processing by Users::RegistrationsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=> 
     "habj5iep5SaE5nkyimzFyVslsCAIvy7ZokmM 
     KA8WDgbgQkYCa/mofo83sllRiwX13OCkPXIjbkR+CcDKBICXOw==", 
     "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", 
     "password_confirmation"=>"[FILTERED]", "login"=> 
     {"userid"=>"breno1", "birthdate"=>"13/07/2017", "sex"=>"M"}}, 
     "commit"=>"Cadastrar"} 
Unpermitted parameter: login 
(10.8ms) BEGIN 
User Exists (10.1ms) SELECT 1 AS one FROM `users` WHERE 
    `users`.`email` = BINARY '[email protected]' LIMIT 1 
SQL (11.5ms) INSERT INTO `users` (`email`, `encrypted_password`, 
    `created_at`, `updated_at`) VALUES ('[email protected]', 
    '$2a$11$4le6ZB5JyrYZGYLXvtlwa.c6BA463BvNYkSINfU0C10LoJADEYJ8q', 
    '2017-07-14 23:24:41', '2017-07-14 23:24:41') 
(18.3ms) COMMIT 
(12.6ms) BEGIN 
SQL (11.0ms) UPDATE `users` SET `sign_in_count` = 1, 
    `current_sign_in_at` = '2017-07-14 23:24:41', `last_sign_in_at` = 
    '2017-07-14 23:24:41', `current_sign_in_ip` = '127.0.0.1', 
    `last_sign_in_ip` = '127.0.0.1' WHERE `users`.`id` = 33 
(11.6ms) COMMIT 
Redirected to http://localhost:3000/ 
Completed 302 Found in 436ms (ActiveRecord: 85.8ms) 


Started GET "/" for 127.0.0.1 at 2017-07-14 20:24:41 -0300 
Processing by HomeController#index as HTML 
Rendering home/index.html.erb within layouts/application 
Rendered home/index.html.erb within layouts/application (0.7ms) 
User Load (13.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` 
    = 33 ORDER BY `users`.`id` ASC LIMIT 1 
Login Load (11.1ms) SELECT `login`.* FROM `login` WHERE 
    `login`.`user_id` = 33 LIMIT 1 
Rendered layouts/_side_navbar.html.erb (26.0ms) 
Completed 500 Internal Server Error in 619ms (ActiveRecord: 24.8ms) 



ActionView::Template::Error (undefined method `userid' for 
    nil:NilClass): 
4:  <div class="sidenav-header-inner text-center"> 
5:   <%= image_tag 'avatar-1.jpg', class: 'img-fluid rounded- 
    circle' %> 
6:   <h2 class="h5 text-uppercase"> 
7:   <%= current_user.login.userid %> 
8:   </h2> 
9:   <span class="text-uppercase"> 
10:   <%= current_user.is_admin? ? 'administrador' : 'jogador' 
    %> 

app/views/layouts/_side_navbar.html.erb:7:in 
`_app_views_layouts__side_navbar_html_erb__415501206315934300_ 
    70011534596860' 
app/views/layouts/application.html.erb:13:in 
`_app_views_layouts_application_html_erb__1458307398416558594_ 
    70011827322320' 
Rendering /home/prikster/.rvm/gems/ruby-2.3.1/gems/actionpack- 
    5.0.2/lib/action_dispatch/middleware/templates/rescues/ 
    template_error.html.erb within rescues/layout 
Rendering /home/prikster/.rvm/gems/ruby-2.3.1/gems/actionpack- 
    5.0.2/lib/action_dispatch/middleware/templates/rescues/ 
    _source.html.erb 
Rendered /home/prikster/.rvm/gems/ruby-2.3.1/gems/actionpack- 
    5.0.2/lib/action_dispatch/middleware/templates/rescues/ 
    _source.html.erb (32.9ms) 
Rendering /home/prikster/.rvm/gems/ruby-2.3.1/gems/actionpack- 
    5.0.2/lib/action_dispatch/middleware/templates/rescues/ 
    _trace.html.erb 
Rendered /home/prikster/.rvm/gems/ruby-2.3.1/gems/actionpack- 
    5.0.2/lib/action_dispatch/middleware/templates/rescues/ 
    _trace.html.erb (5.0ms) 
Rendering /home/prikster/.rvm/gems/ruby-2.3.1/gems/actionpack- 
    5.0.2/lib/action_dispatch/middleware/templates/rescues/ 
    _request_and_response.html.erb 
Rendered /home/prikster/.rvm/gems/ruby-2.3.1/gems/actionpack- 
    5.0.2/lib/action_dispatch/middleware/templates/rescues/ 
    _request_and_response.html.erb (1.7ms) 
Rendered /home/prikster/.rvm/gems/ruby-2.3.1/gems/actionpack- 
    5.0.2/lib/action_dispatch/middleware/templates/rescues/ 
    template_error.html.erb within rescues/layout (62.6ms) 

Ist accepts_nested_attributes_for in dem richtigen Modell?

Im Protokoll befindet sich eine Zeile, die auf Unpermitted parameter: login zeigt. Was soll ich tun, um dies zu korrigieren?

+0

Können Sie die Protokolle veröffentlichen, die angezeigt werden, sobald Sie auf "Senden" klicken? – Pavan

+0

Können Sie uns auch die create Methode zeigen? – Pavan

+0

Ich habe die create-Methode hinzugefügt. Wie Sie sehen können, rufen Sie einfach Super für die create-Methode von devise auf. Wie für das Protokoll, bin ich jetzt bei der Arbeit und sobald ich nach Hause komme werde ich es posten. –

Antwort

1

Ich löste mein Problem.

Ich musste nur eine required: false Login-Beziehung mit dem Benutzer hinzufügen.

Mein Log-Modell ist wie folgt nun:

class Login < ApplicationRecord 
    belongs_to :user, required: false 
end 

Ich denke, das Problem war, wenn es versucht, die Benutzer zu erstellen/speichern Anmeldung haben die ID noch nicht hatte.

Am Ende werden beide Modelle erstellt, mit Beziehung zwischen ihnen und sie haben beide ihre Attribute mit ihren richtigen Werten.

+0

Ja. Aus diesem Grund empfehle ich Ihnen, Folgendes zu lesen: https://stackoverflow.com/questions/17767449/rails-4-0-with-devise-nested-attributes-unpermited-parameters und Devise Wiki: –