في القضبان :قم باسترجاع مدخلات المستخدم من نموذج غير مرتبط بنموذج، واستخدم النتيجة داخل وحدة التحكم
-
01-07-2019 - |
سؤال
إليك نسخة مبسطة لما أحاول القيام به:
- قبل تنفيذ أي إجراءات أخرى، قدم للمستخدم نموذجًا لاسترداد سلسلة.
- أدخل السلسلة، ثم أعد التوجيه إلى إجراء وحدة التحكم الافتراضية (على سبيل المثال.فِهرِس).يجب أن تكون السلسلة موجودة فقط، ولا يلزم إجراء عمليات تحقق أخرى.
- يجب أن تكون السلسلة متاحة (كمتغير مثيل؟) لجميع الإجراءات في وحدة التحكم هذه.
أنا جديد جدًا في استخدام Rails، لكن لا يبدو أن الأمر صعب للغاية، لذلك أشعر بالغباء نوعًا ما.
ما حاولت:انا املك before_filter
إعادة التوجيه إلى الطريقة الخاصة التي تبدو
def check_string
if @string
return true
else
get_string
end
end
ال get_string
تبدو الطريقة
def get_string
if params[:string]
respond_to do |format|
format.html {redirect_to(accounts_url)} # authenticate.html.erb
end
end
respond_to do |format|
format.html {render :action =>"get_string"} # get_string.html.erb
end
end
فشل هذا لأن لدي مكالمتين لتقديم أو إعادة توجيه في نفس الإجراء.يمكنني إخراج ذلك أولاً respond_to
, بالطبع، ولكن ما يحدث هو أن وحدة التحكم محاصرة في ملف get_string
طريقة.أستطيع أن أرى بشكل أو بآخر سبب حدوث ذلك، لكنني لا أعرف كيفية إصلاحه والخروج منه.أحتاج إلى أن أكون قادرًا على إظهار نموذج واحد (عرض)، والحصول على شيء ما باستخدام سلسلة الإدخال ثم القيام به، ثم المتابعة كالمعتاد.
ال get_string.html.erb
يبدو الملف
<h1>Enter a string</h1>
<% form_tag('/accounts/get_string') do %>
<%= password_field_tag(:string, params[:string])%>
<%= submit_tag('Ok')%>
<% end %>
سأكون شاكرا لأية مساعدة!
يحرر
شكرا على الردود...
@ لوري يونغ:أنت على حق، لقد كان سوء الفهم.لسبب ما كان يدور في ذهني أن مثيل أي وحدة تحكم معينة يستدعيها المستخدم سيستمر طوال الجلسة، وأن بعض سحر Rails كان في تتبع الكائنات المرتبطة بكل جلسة مستخدم.أستطيع أن أرى لماذا لا يكون ذلك منطقيًا إلى حد كبير عند الرجوع إلى الماضي، ولماذا لن تنجح محاولتي لاستخدام متغير مثيل (والذي كنت أعتقد أنه سيستمر).شكرا لك ايضا :)
المحلول
جزء من المشكلة هو أنك لا تقوم بتعيين @string.لا تحتاج حقًا إلى before_filter لهذا على الإطلاق، ويجب أن تكون قادرًا على استخدام:
def get_string
@string = params[:string] || session[:string]
respond_to do |format|
if @string
format.html {redirect_to(accounts_url)} # authenticate.html.erb
else
format.html {render :action =>"get_string"} # get_string.html.erb
end
end
end
إذا كنت تريد أن يكون المتغير @string متاحًا لجميع الإجراءات، فستحتاج إلى تخزينه في الجلسة.
نصائح أخرى
يبدو لي أنك تفتقد مفهوم القضبان.كل صفحة يراها المستخدم هي طلب مختلف.
ربما أخطأت في فهم ما تحاول القيام به.ولكن يبدو لي أنك تريد أن يرى المستخدم صفحتين،
- في الصفحة الأولى قاموا بتعيين متغير سلسلة
- في الصفحة الثانية يرون صفحة تعتمد بطريقة أو بأخرى على مجموعة المتغيرات
أفضل طريقة للقيام بذلك هي استخدام مرشح سابق يتحقق من وجود المتغير، وإذا لم يتم تعيينه، يعيد التوجيه إليهم إلى النموذج، ويستمر بخلاف ذلك
class MyController < ApplicationController::Base
before_filter :require_string
def require_string
return true if @string #return early if called multiple times in one request
if params['string'] or session['string'] #depending on if you set it as a URL or session var
@string = (params['string'] or session['string'])
return true
end
#We now know that string is not set
redirect_to string_setting_url and return false #the return false prevents any futher processing in this request
end
end
هذه هي الفكرة الأساسية وراء كيفية عمل المكونات الإضافية مثل RestfulAuthentication.في هذه الحالة، "السلسلة" هي رمز تسجيل الدخول (معرف المستخدم على ما أعتقد)، ويتم تخزينها في الجلسة.
إذا ألقيت نظرة على login_required' action in
Authenticated_system.rb` من ResultfulAuth:إنه يفعل هذا بشكل أساسي، على الرغم من أنه يحتوي على عدد قليل من تصحيحات الأخطاء، ويتم إضافة أشياء أخرى