كيفية تمرير أخطاء النماذج في الجلسة أو الفلاش؟ [القضبان 2.3.5

StackOverflow https://stackoverflow.com/questions/2573350

سؤال

لديّ إجراء إنشاء لنموذج يحتمل أن يولد أخطاء (أي الاسم الأول مفقود) ثم يعيد التوجيه.

المشكلة هي أنه عندما يحدث إعادة التوجيه هذه أخطاء النموذج. كيف يمكنني تمرير أخطاء النماذج هذه في جلسة ليتم عرضها مرة أخرى في النموذج الأصلي (والتي يجب أن تملأ بالتفاصيل السابقة ، كما في سلوك 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top