في القضبان :قم باسترجاع مدخلات المستخدم من نموذج غير مرتبط بنموذج، واستخدم النتيجة داخل وحدة التحكم

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

  •  01-07-2019
  •  | 
  •  

سؤال

إليك نسخة مبسطة لما أحاول القيام به:

  1. قبل تنفيذ أي إجراءات أخرى، قدم للمستخدم نموذجًا لاسترداد سلسلة.
  2. أدخل السلسلة، ثم أعد التوجيه إلى إجراء وحدة التحكم الافتراضية (على سبيل المثال.فِهرِس).يجب أن تكون السلسلة موجودة فقط، ولا يلزم إجراء عمليات تحقق أخرى.
  3. يجب أن تكون السلسلة متاحة (كمتغير مثيل؟) لجميع الإجراءات في وحدة التحكم هذه.

أنا جديد جدًا في استخدام 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 متاحًا لجميع الإجراءات، فستحتاج إلى تخزينه في الجلسة.

نصائح أخرى

يبدو لي أنك تفتقد مفهوم القضبان.كل صفحة يراها المستخدم هي طلب مختلف.

ربما أخطأت في فهم ما تحاول القيام به.ولكن يبدو لي أنك تريد أن يرى المستخدم صفحتين،

  1. في الصفحة الأولى قاموا بتعيين متغير سلسلة
  2. في الصفحة الثانية يرون صفحة تعتمد بطريقة أو بأخرى على مجموعة المتغيرات

أفضل طريقة للقيام بذلك هي استخدام مرشح سابق يتحقق من وجود المتغير، وإذا لم يتم تعيينه، يعيد التوجيه إليهم إلى النموذج، ويستمر بخلاف ذلك

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

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