Rails 3 - Mostra tutti gli errori per Has-One appartiene: ai modelli tramite controller
-
16-12-2019 - |
Domanda
Sviluppo l'app ROR e ho incontrato la cosa che non posso risolvere.Ho 2 modelli - Utente e Insegnante .
class User < ActiveRecord::Base
...
has_one :teacher
accepts_nested_attributes_for :teacher
end
class Teacher < ActiveRecord::Base
...
belongs_to :user
end
.
Inoltre ho vista con moduli per riempire i dati dell'utente e dell'insegnante.Dopo aver inviato dati da questo modulo, passa in altri metodi del mio controller - Create_teacher .Inoltre ho altro metodo new_teacher , in questo metodo ho la mia vista con i moduli.
class AdminsController < ApplicationController
def new_teacher
@user = User.new
teacher = @user.build_teacher
end
def create_teacher
params[:user][:user_role] = "teacher"
user = User.new(params[:user])
if user.valid?
user.save
teacher = user.build_teacher( params[:user][:teacher_attributes] )
if teacher.valid?
teacher.save
redirect_to admins_users_of_system_path
flash[:success] = "Teacher created!"
else
redirect_to admins_new_teacher_path
flash[:error] = teacher.errors.full_messages.to_sentence
user.destroy
end
else
redirect_to admins_new_teacher_path
flash[:error] = user.errors.full_messages.to_sentence
end
end
end
.
La mia vista new_teacher.html.erb
<%= form_for @user, :url => create_teacher_url, :html => {:class => "form-horizontal"} do |f| %>
<%= field_set_tag do %>
<%= f.fields_for :teacher do |builder| %>
<div class="control-group">
<%= builder.label :teacher_last_name, "Last name", :class => "control-label" %>
<div class="controls">
<%= builder.text_field :teacher_last_name %>
</div>
</div>
...
<% end %>
<div class="control-group">
<%= f.label :user_login, "Login", :class => "control-label" %>
<div class="controls">
<%= f.text_field :user_login, :value => "" %>
<%= link_to_function "Generate login", "generate_login()", :class => "btn" %>
</div>
</div>
...
<% end %>
<%= f.submit "Create", :class => "btn btn-large btn-success" %>
<% end %>
.
Ho 2 domande:
1) Come posso mostrare tutti gli errori (per utente e insegnante)?È possibile?
2) È possibile mantenere i miei dati in moduli quando reindirizzano a Admins_new_teacher_path da Create_teacher Metodo?
Soluzione 4
Ho trovato la soluzione giusta.Per questo dovremmo usare ACCECTS_NESTED_ATTRIBUTE_FOR.Quindi, quando lo abbiamo fatto quando creiamo ai modelli
user = User.new( params[:user] ) # Using nested attributes in our model
if user.save
..
else
all_errors = user.errors
end
.
Qui otteniamo tutti gli errori di user.errors
.
Altri suggerimenti
Nella pagina Visualizza è possibile utilizzare form.object.errors
Controlla il codice
Per l'oggetto Form Utilizzare f.object.errors
in forma laterale
Per Form Object Builder builder.object.errors
in fianco il modulo nidificato
e eseguire un render :action => :new_teacher
sul controller
Per ottenere l'oggetto è possibile scrivere <%=debug(form.object.errors)%>
come riferimento
def create_teacher
user_errors, teacher_errors, redirect_path = nil, nil, nil
params[:user][:user_role] = "teacher"
user = User.new(params[:user])
if user.save
redirect_path = admins_users_of_system_path
flash[:success] = "Teacher created!"
else
redirect_path = admins_new_teacher_path
user_errors = user.errors.full_messages.to_sentence
teacher_errors = user.teacher.errors.full_messages.to_sentence if user.teacher
end
errors_arr = [user_errors, teacher_errors].compact
flash[:error] = "Errors for user: \n" + errors_arr.join("\n Errors for teacher") if errors_arr.present?
redirect_to redirect_path
end
. potresti e.g.Convalida il tuo campo insegnante_last_name nel tuo modello:
validate :ensure_teacher_exists
def ensure_teacher_exists
unless Teacher.find_by_teacher_last_name(teacher_last_name)
errors.add(:teacher_last_name, "does not exist")
end
end
.
Allora devi aggiungere in TUO punto di vista:
<%= builder.error_message_on :teacher_last_name %>
.
Visualizza il messaggio di errore vicino al campo.
Se si verifica un errore "metodo non indifinato" aggiungi il seguente metodo per config / inizializzatori / form_builder.rb
def error_message_on(attr)
message = Error.message(object, attr)
@template.content_tag(:div, message, :class => 'error_message') if message.present?
end
.