لماذا لا تعمل متغيرات مثيل وحدة التحكم الخاصة بي في وجهات النظر (القضبان)

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

سؤال

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

class ExampleController < ApplicationController
  @var1 = "Cheese"
  @var2 = "Tomato"

  def show_pizza_topping
    # What I want is the above instance vars from within the view here
  end

  def show_sandwich_filling
    # What I want is the above instance vars from within the view here
  end
end

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

(ملاحظة: هذا مثال على القمامة ، لكنني آمل أن يكون ذلك منطقيًا)

تحرير: لقد وجدت إجابة لهذا السؤال هنا: متى يتم تعيين متغيرات مثيل Ruby؟

تحرير 2: ما هو أفضل وقت لاستخدام المرشحات مثل Quaret_Filter وطريقة التهيئة؟

هل كانت مفيدة؟

المحلول

يجب التعامل مع هذه الأنواع من الأشياء في before_filter. قبل أن يرشح المرشح ، كما يوحي الاسم ، طريقة سيتم استدعاؤها قبل أي إجراءات ، أو فقط الإجراءات التي تعلن. مثال:

class ExampleController < ApplicationController

  before_filter :set_toppings

  def show_pizza_topping
    # What I want is the above instance vars from within the view here
  end

  def show_sandwich_filling
    # What I want is the above instance vars from within the view here
  end

protected

  def set_toppings
    @var1 = "Cheese"
    @var2 = "Tomato"
  end

end

أو ، يمكن أن يكون لديك قبل_filter فقط العمل على أحد أفعالك

before_filter :set_toppings, :only => [ :show_pizza_topping ]

أتمنى أن يساعدك هذا.

تحرير: إليك المزيد من المعلومات حول المرشحات في ActionController.

نصائح أخرى

هذه ليست متغيرات مثيل ، أليس كذلك؟

class A
  @x = 5
  def f
    puts @x
  end
end

A.new.f
=> nil

أنت تحددها على مستوى الفصل ، وليس على مستوى المثيل. كما يشير "theiv" ، تحتاج إلى تعيينها داخل طريقة مثيل.

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