Por que as variáveis ​​de instância do meu controlador não funcionam nas visualizações (Rails)

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

Pergunta

Gostaria de adicionar algumas variáveis ​​de instância ao meu controlador, uma vez que as variáveis ​​em questão são necessárias em mais de uma visão de ação.No entanto, o exemplo abaixo não funciona como eu esperaria.

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

Pelo que entendi, o Rails pega as variáveis ​​de instância do controlador e as disponibiliza na visualização.Se eu atribuir as mesmas variáveis ​​dentro dos métodos de ação, tudo funcionará bem - mas não quero fazer isso duas vezes.Por que meu jeito não funciona?

(Observação:este é um exemplo meio lixo, mas espero que faça sentido)

EDITAR:Encontrei a resposta para esta pergunta aqui: Quando as variáveis ​​de instância Ruby são definidas?

EDITAR 2:quando é o melhor momento para usar filtros como before_filter e o método de inicialização?

Foi útil?

Solução

Esses tipos de coisas devem ser tratados de maneira before_filter.Um filtro before, como o nome indica, é um método que será chamado antes de qualquer ação, ou apenas daquelas que você declarar.Um exemplo:

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

Ou você pode fazer com que seu before_filter funcione apenas em uma de suas ações

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

Espero que isto ajude.

EDITAR:Aqui estão mais algumas informações sobre filtros em ActionController.

Outras dicas

Essas não são variáveis ​​de instância, são?

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

A.new.f
=> nil

Você está definindo isso no nível da classe, não no nível da instância.Como aponta "theIV", você precisa atribuí-los dentro de um método de instância.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top