Domanda

Vorrei aggiungere un paio di variabili di istanza al mio controller, poiché le variabili in questione sono richieste da più di una vista di azione. Tuttavia, l'esempio seguente non funziona come mi aspetterei.

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

A quanto ho capito, Rails prende le variabili di istanza dal controller e le rende disponibili nella vista. Se assegno le stesse variabili all'interno dei metodi di azione, funziona bene, ma non voglio farlo due volte. Perché la mia strada non funziona?

(Nota: questo è un po 'un esempio di spazzatura, ma spero abbia senso)

EDIT: ho trovato la risposta a questa domanda qui: When do Ruby le variabili di istanza vengono impostate?

MODIFICA 2: qual è il momento migliore per utilizzare i filtri come before_filter e il metodo di inizializzazione?

È stato utile?

Soluzione

Questi tipi di cose dovrebbero essere gestiti in un before_filter . Un filtro prima, come suggerisce il nome, è un metodo che verrà chiamato prima di qualsiasi azione, o solo quelle dichiarate. Un esempio:

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

Oppure, potresti avere il tuo before_filter funzionare solo su una delle tue azioni

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

Spero che questo aiuti.

EDIT: ecco alcune ulteriori informazioni sui filtri in ActionController .

Altri suggerimenti

Quelle non sono variabili di istanza, vero?

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

A.new.f
=> nil

Lo stai definendo a livello di classe, non a livello di istanza. Come "theIV" sottolinea, è necessario assegnarli all'interno di un metodo di istanza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top