Frage

Ich möchte meinem Controller ein paar Instanzvariablen hinzufügen, da die fraglichen Variablen aus mehr als einer Aktion erforderlich sind. Das folgende Beispiel funktioniert jedoch nicht wie ich erwarten würde.

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

Soweit ich es verstehe, nimmt Rails die Instanzvariablen vom Controller und stellt sie in der Ansicht zur Verfügung. Wenn ich die gleichen Variablen innerhalb der Aktionsmethoden zuweist, funktioniert es einwandfrei - aber ich möchte es nicht zweimal tun. Warum funktioniert mein Weg nicht?

(Hinweis: Dies ist ein bisschen ein Müllbeispiel, aber ich hoffe, es macht Sinn)

Bearbeiten: Ich habe die Antwort auf diese Frage hier gefunden: Wann werden Ruby -Instanzvariablen eingestellt?

Bearbeiten 2: Wann ist die beste Zeit, um Filter wie PROW_FILTER und die initialisierende Methode zu verwenden?

War es hilfreich?

Lösung

Diese Art von Dingen sollte in einem behandelt werden before_filter. Ein vorfilter, wie der Name impliziert, ist eine Methode, die vor allen Aktionen aufgerufen wird, oder nur die, die Sie deklarieren. Ein Beispiel:

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

Oder Sie können Ihren Vorab -Datei nur an einer Ihrer Aktionen arbeiten lassen

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

Hoffe das hilft.

Bearbeiten: Hier finden Sie einige weitere Informationen dazu Filter in ActionController.

Andere Tipps

Das sind keine Instanzvariablen, oder?

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

A.new.f
=> nil

Sie definieren es auf der Klassenebene, nicht auf Instanzebene. Wie "theiv" betont, müssen Sie sie innerhalb einer Instanzmethode zuweisen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top