كيفية تمرير أخطاء النماذج في الجلسة أو الفلاش؟ [القضبان 2.3.5
-
24-09-2019 - |
سؤال
لديّ إجراء إنشاء لنموذج يحتمل أن يولد أخطاء (أي الاسم الأول مفقود) ثم يعيد التوجيه.
المشكلة هي أنه عندما يحدث إعادة التوجيه هذه أخطاء النموذج. كيف يمكنني تمرير أخطاء النماذج هذه في جلسة ليتم عرضها مرة أخرى في النموذج الأصلي (والتي يجب أن تملأ بالتفاصيل السابقة ، كما في سلوك error_messages الأصلي)؟
شكرًا!
الرمز:
def create
@contact = Contact.new(params[:contact])
if @contact.save
flash[:notice] = "Sent."
else
flash[:notice] = "Error."
end
end
المحلول
هذه مشكلة صعبة واجهت مشكلة مع نفسي. السؤال الأول الذي سأطرحه هو لماذا تحتاج إلى إعادة توجيه عند العثور على الأخطاء؟ كان إجبارك على تقديم الإجراء عندما تكون هناك أخطاء قرارًا واعًا لمصممي إطار Rails بسبب المخاوف المتعلقة بالتعقيد وقابلية الاستخدام.
إليك المشكلة الكبيرة ، لذلك في إجراءك ، تقوم بإنشاء مثيل لنموذج باستخدام params ، وفشل التحقق من صحة الكائن وتقرر إعادة توجيه إجراء آخر. قبل إعادة توجيه إجراء آخر ، يجب عليك حفظ الحالة الحالية لمثيل النموذج الخاص بك إلى الجلسة ثم إعادة توجيه إلى العمل: FOO. في العمل: يجب عليك إعادة تحديث السمات وتحديث الأخطاء إلى العرض عبر متغير مثيل. المشكلة هنا هي أنك تقترن الإجراءات في وحدة التحكم الخاصة بك وهو أمر سيء (هناك إجراء واحد يعتمد على الآخر). هناك مجموعة من المشكلات الأخرى التي يمكنني كتابتها إلى الأبد ، ولكن إذا كنت بحاجة فقط إلى القيام بذلك لمورد واحد ، فإليك كيف سأفعل ذلك:
config/routes.rb
map.resources :things, :member => { :create_with_errors => :get }
ings_controller.rb
def new
@thing = Thing.new
end
def create
@thing = Thing.create(params[:thing])
if @thing.save
redirect_to things_path
else
session[:thing] = @thing
redirect_to create_errors_thing_path(@thing)
end
end
def create_with_errors
@thing = session[:thing]
@errors = @thing.errors
render :action => :new
end
التطبيق/المشاهدات/الأشياء/new.html.erb
<% if defined?(@errors) %>
<% #do something with @errors to display the errors %>
<% end %>
<!-- render the form stuff -->
أعرف ما تفكر فيه ... هذا بشع. ثق بي ، لقد بذلت الكثير من المحاولات لمعالجة هذه المشكلة وقد أدركت أن الآلية التي اختارها مطورو القضبان هي أفضل وأسهل طريقة للتعامل مع الأخطاء.
نصائح أخرى
تتمثل الاتفاقية في القضبان في تقديم عرض الإجراء الأصلي بدلاً من القيام بإعادة التوجيه. لذا فإن الكود الخاص بك سيبدو هكذا:
def create
@contact = Contact.new(params[:contact])
if @contact.save
flash[:notice] = 'Sent.'
redirect_to @contact
else
flash.now[:notice] = 'Error.'
render :new
end
end
إذا كان هناك أي إعداد إضافي يجب القيام به ل new
الإجراء ، استخراج الكود المشترك في طريقة خاصة واتصل به في أ before_filter
لكليهما new
و create
.