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:
- den Benutzer erstellt, aber nicht schafft die Login
- 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?
Können Sie die Protokolle veröffentlichen, die angezeigt werden, sobald Sie auf "Senden" klicken? – Pavan
Können Sie uns auch die create Methode zeigen? – Pavan
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. –