Por que as variáveis de instância do meu controlador não funcionam nas visualizações (Rails)
-
06-07-2019 - |
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?
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.