Rails: Defina uma variável de instância comum em várias ações do controlad
Como alguém deve ter várias ações de controlador diferentes para definir uma variável de instância comumpara uso em modelos masapós a ação ser executada.
Em outras palavras, eu quero que isso funcione no meu application_controlle
class ApplicationController < ActionController::Base
after_filter :set_something_common
def set_something_common
# All controllers' actions have queried the DB and set @foo for me...
@bar = some_calculation_on(@foo)
# ... and all templates expect @bar to bet set.
end
end
Estenão funcion Porqueafter_filter
é executado após a renderização. Bem. Mas qual é o padrão correto?
Novamente, é importante queset_something_common
é executado após a ação porque essas ações fazem coisas específicas de caso; mas todos eles definem@foo
.
Nenhuma das minhas idéias parece ideal:
Ligarset_something_common()
na parte inferior de todas as ações que precisaRefator todos os códigos específicos de cada caso dos controladores paracase_specific_code()
e force-os a executar em ordem:
before_filter :case_specific_code, :set_something_common
Subclassapplication_controller
e redefina oindex
método.
Alguma ideia? Obrigado
Edit: A resposta de Matthew me levou a esclarecer: Vários índices dos controladores () fazem paginação, cada um tendo parâmetros@offset
e@limit
(através de um @ globbefore_filter
) para visualizar fatias de dados. Ótimo. Agora, quero um método comum para calcular um URL RESTful para o link "next slice". Fui encorajado a ver queurl_for()
gera uma URL retornando ao mesmo recurso, então tentei:
def set_something_common # really called set_next_url, truth be told
@next_url = url_for(:offset => @offset + @limit, :limit => @limit)
end
Vou tentar fazer o patch do macaco Fixnum, para que eu possa fazer algo como@offset.next_url_for(self, @limit)
do modelo, mas não tenho certeza se funcionará. Venha para pensar sobre isso, se vou modificar os modelos, então é melhor configurar um auxiliar de aplicativo. Ainda não tenho certeza de qual é a melhor solução.
Obrigado pelas atualizações de todos. Aprendi minha lição de que ajudantes, como variáveis globais, existem por uma razão e não devem ser evitados quando são claramente benéficos e sucinto