Ações de um Controller em outro Controller

636 views
Skip to first unread message

Alessandro

unread,
Jun 20, 2011, 5:54:21 PM6/20/11
to rails-br
Senhores (as),

Sei que pode parecer arcaico e desnecessário, mas estou querendo
montar um meio de gravar LOGs de alguns dados em meu sistema WEB, mais
a critério de curiosidade.

Criei um MODEL com os dados que quero armazenar e um CONTROLLER para
criar uma ação (ou função) e poder chamar isso em outros pontos do
sistema. Contudo quando tento chamar LogController.acao(param1,
param2) em qualquer outro Controller do sistema, o Rails diz que a
função "acao" não existe, sendo que ela existe. Tentei com outras
ações de Controller que já estão em funcionamento e também o mesmo
erro ocorre. Tentei então criar essa ação num Helper e quando chamo
LogHelper.acao(param1, param2) o mesmo erro ocorre.

Com certeza estou fazendo algo bem estúpido. Pesquisei no Google e
aqui no grupo mas não achei nada (pra falar a verdade, nem os termos
que preciso pra realizar a pesquisa eu sei direito). Vocês poderiam:

1 - Me explicar o porque isso não funciona? Se possível citando os
conceitos de Rails...
2 - Como faço pra poder ter uma ação (ou função) que posso chamar em
qualquer lugar para, por exemplo, gerar LOG.

OBS 1: Sei que não é o modo melhor de se por LOG no site, mas como já
disse é só pra eu estudar e aprender.

OBS 2: Os dados do meu ambiente de teste:
- OS: Windows 2003 Server
- Ruby: 1.8
- Rails: 2.1
- Web Server: WEBRick
- BD: MySQL

Obrigado.

vitor francisco

unread,
Jun 20, 2011, 6:00:26 PM6/20/11
to rail...@googlegroups.com
entao , dxo ve se é oq eu pensei se for tem 2 maneiras q conheço de resolver vo tentar explicar a q lembro de kbeça ehehe.


no outro controller q vou chamar de post n sei pq.

no seu controller Post:

before_filter :load_resources


def load_resources
    @logs = Log.all
end

dai oq ta acontecendo aki, vc ta dizendo no seu controller de post, la em cima msm que antes de carregar as actions do seu propio controller vc ker q ele carregue aquilo primeiro, dai aquilo seria seus logs.
consequentemente estarao tb acessiveis nas suas views de post, pois oq é posto nos controllers desce pras views .

espero ter ajudado



--
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/rails-br?hl=pt-BR.




--
Vitor Santos - Engineer Ti 
Word is OpenSource -- Linux User 


Everaldo Gomes

unread,
Jun 20, 2011, 6:18:04 PM6/20/11
to rail...@googlegroups.com
Olá!

Sou novo na lista e em rails, mas a impressão que eu tenho é que rails já tem um mecanismo de log (não sei como usa)
e de que não seria necessário usar outro Controller.

Além disso, um Logger é um singleton (instância única e acessível em toda a aplicação). Teoricamente, seria legal não 
precisar instanciá-lo nunca.

Bom, desculpe se não fui útil, vou dar uma olhada na NET e se eu ver algo legal, posto aqui.

Boa sorte.

Everaldo

2011/6/20 vitor francisco <vito...@gmail.com>

Everaldo Gomes

unread,
Jun 20, 2011, 6:19:22 PM6/20/11
to rail...@googlegroups.com
Achei esse vídeo, do Railscasts:


Everaldo

2011/6/20 Everaldo Gomes <everald...@gmail.com>

Luiz Costa

unread,
Jun 20, 2011, 7:10:37 PM6/20/11
to rail...@googlegroups.com
Olá,

Eu não consegui entender direito o propósito do log, mas uma forma de ter uma ação em todos os controllers é adicionando ela ao ApplicationController.

De modo semelhante para se ter um helper disponível em toda a aplicação ele deve ser adicionado ao ApplicationHelper.

Em 20 de junho de 2011 19:31, vitor francisco <vito...@gmail.com> escreveu:
Everaldo meu caro,

acredito que a soluçao que vc propost é algo usado para outro fim, segundo o link que vc mandou funciona assim.,

em ambiente de development ele usa o log pra printa praticamente tudo,
ja em produçao o log é diferente vc nao vai querer logar tudo da sua aplicaçao, mais se vc kiser logar algo especifico este é 1 geito, caso ache 1 bug e nao sabe pq ta dando algo do genero vc passa pra modo de debug e marca o codigo q vc ker q loge

vitor francisco

unread,
Jun 20, 2011, 6:31:11 PM6/20/11
to rail...@googlegroups.com
Everaldo meu caro,

acredito que a soluçao que vc propost é algo usado para outro fim, segundo o link que vc mandou funciona assim.,

em ambiente de development ele usa o log pra printa praticamente tudo,
ja em produçao o log é diferente vc nao vai querer logar tudo da sua aplicaçao, mais se vc kiser logar algo especifico este é 1 geito, caso ache 1 bug e nao sabe pq ta dando algo do genero vc passa pra modo de debug e marca o codigo q vc ker q loge
Em 20 de junho de 2011 19:19, Everaldo Gomes <everald...@gmail.com> escreveu:

Alessandro

unread,
Jun 21, 2011, 8:18:26 AM6/21/11
to rails-br
Obrigado pelas respostas pessoal, contudo como dito no texto que eu
escrevi, o fato de fazer um LOG não é relevante (não se preocupem com
isso). Ele serve apenas para eu explicar uma dúvida em chamar uma ação
de um Controller em qualquer Controller ou outro lugar do sistema.

Everaldo, não criei uma nova instância em nenhum momento... Chamo ele
como um SINGLETON sempre, assim como fazemos com boa parte de nossos
códigos no que diz respeito a Controller, pelo menos ao meu ver.
Acredito que é aí que mora o problema e minha dúvida. A gente sempre
lê conceitos e descrições sobre o Controller, mas ninguém sai do
básico e entra UM POUCO na parte de patterns pra entendermos esses
conceitos do Rails. Quando achamos algo assim já está no outro extremo
e não consigo entender porque fica muito técnico (ta ta... não me
chamem de burro hein, risos)

Vitor, muito obrigado pela ajuda, mas me perdoe de verdade porque não
consigo entender bem suas postagem dado ao seu jeito peculiar de
escrever. Isso se aplica principalmente na primeira postagem nesse
POST, contudo entendi a segunda e concordo plenamente no que escreveu
ao Everaldo. De qualquer modo, obrigadão e fique a vontade para mais
postagens.

Everaldo, PRA MIM não da pra ficar usando o LOG do Rails dado a N
motivos, principalmente a atrapalhar performance. Novamente PRA MIM, o
ideal é que se desenvolva um especificamente pra isso e tenho plena
certeza que no GITHUB deve ter uns 2.364.128 pacotes prontos pra isso
(risos). Mas, como eu já disse, o LOG em si não é o importante nesse
post.

Luiz, vou tentar agora usar sua dica... Pode ser um meio de se
fazer... Mas porque não conseguimos chamar as funções de um Controller
dentro de outro? Você saberia dizer?

Alguém mais dos 2.000 mil participantes do grupo pode ajudar?

Abraços...

Luiz Costa

unread,
Jun 21, 2011, 8:24:11 AM6/21/11
to rail...@googlegroups.com
Alessandro,

Acho que o que é possível fazer dentro dos controllers é você redirecionar para um outro controller. Pensando no funcionamento do MVC no Rails, cada controller corresponde a uma ação na aplicação. Se você tem um trecho de código que você quer executar em mais de um local, esse trecho de código não é uma ação isolada. Logo não faz sentido implementar como uma ação em um controller e sim como um método disponível em todos os controllers.

São preceitos muito parecidos com os before_filter que temos no controller, entre outras coisas.

Abs.

Alessandro

unread,
Jun 21, 2011, 8:34:53 AM6/21/11
to rails-br
Entendi seu ponto de vista Luiz, mas então estamos limitados a apenas
usar o ApplicationController ou o ApplicationHelper se quisermos
disponibilizar uma ação em todo o sistema? Não há outro jeito?

[]s

On 21 jun, 09:24, Luiz Costa <lhd...@gmail.com> wrote:
> Alessandro,
>
> Acho que o que é possível fazer dentro dos controllers é você redirecionar
> para um outro controller. Pensando no funcionamento do MVC no Rails, cada
> controller corresponde a uma ação na aplicação. Se você tem um trecho de
> código que você quer executar em mais de um local, esse trecho de código não
> é uma ação isolada. Logo não faz sentido implementar como uma ação em um
> controller e sim como um método disponível em todos os controllers.
>
> São preceitos muito parecidos com os before_filter que temos no controller,
> entre outras coisas.
>
> Abs.
>

Rogerio Medeiros

unread,
Jun 21, 2011, 8:35:25 AM6/21/11
to rail...@googlegroups.com
Um, eu nao entendi bem, lol

+ olha o que eu pensei.

Voce poderia criar um controller de log e xama-lo onder quer gravar o mesmo

Tipo

Eu tenho o controller User, dentro dele tem o metodo flash[:notice] = "User gravado com sucesso." que eu sempre uso
Bom quero gravar esse flash[:notice]
Voce fez a tabela log, dentro dele colocar um campo text - descricao
@log.descricao = flash[:notice] = "User gravado com sucesso."
@log.save

Foi u que eu entedi, rs

Sorry
--
Atenciosamente,

Rogerio
def sou_eu
    sou_eu = ''
    [82,117,98,121,32,68,101,118,101,108,111,112,101,114].each do |creu|
        sou_eu += creu.chr
    end
    sou_eu
end
sou_eu


Meu blog sobre rails http://argerim.wordpress.com
A inteligência veio para todos, desenvolve-la ficou para poucos. (Rogerio Filho)

Luiz Costa

unread,
Jun 21, 2011, 8:39:39 AM6/21/11
to rail...@googlegroups.com
Alessandro,

Não posso afirmar se existe ou não outro jeito. Mas esta é a maneira como foi pensado para funcionar. E, conforme o princípio de Convention over Configuration do Rails, este deve ser o modo mais conveniente.

Alessandro

unread,
Jun 21, 2011, 8:41:30 AM6/21/11
to rails-br
Então Rogério...

Acho que nesse caso que você apresentou não estamos falando de
Controller... Estamos falando somente de Model pelo que estudei (peço
ajuda do pessoal pra ver se não to falando asneira). Digo isso porque
toda vez que chama a entidade como chamou, você está usando o Model do
MVC. O que quero é chamar uma ação antes (ou função) pra passar uns
valores, fazer umas análises dentro dessa ação e, daí, gravar como
você sugeriu (a papular camada de negócio ou Controller).

Não sei se fui claro na minha explicação, me perdoe... Mas se
conseguiu entender, o que acha?

[ ]s

On 21 jun, 09:35, Rogerio Medeiros <arge...@gmail.com> wrote:
> Um, eu nao entendi bem, lol
>
> + olha o que eu pensei.
>
> Voce poderia criar um controller de log e xama-lo onder quer gravar o mesmo
>
> Tipo
>
> Eu tenho o controller User, dentro dele tem o metodo flash[:notice] = "User
> gravado com sucesso." que eu sempre uso
> Bom quero gravar esse flash[:notice]
> Voce fez a tabela log, dentro dele colocar um campo text - descricao
> @log.descricao = flash[:notice] = "User gravado com sucesso."
> @log.save
>
> Foi u que eu entedi, rs
>
> Sorry
>
> Em 21 de junho de 2011 09:24, Luiz Costa <lhd...@gmail.com> escreveu:
>
>
>
>
>
>
>
>
>
> > Alessandro,
>
> > Acho que o que é possível fazer dentro dos controllers é você redirecionar
> > para um outro controller. Pensando no funcionamento do MVC no Rails, cada
> > controller corresponde a uma ação na aplicação. Se você tem um trecho de
> > código que você quer executar em mais de um local, esse trecho de código não
> > é uma ação isolada. Logo não faz sentido implementar como uma ação em um
> > controller e sim como um método disponível em todos os controllers.
>
> > São preceitos muito parecidos com os before_filter que temos no controller,
> > entre outras coisas.
>
> > Abs.
>
> Meu blog sobre railshttp://argerim.wordpress.com

Alessandro

unread,
Jun 21, 2011, 8:44:45 AM6/21/11
to rails-br
Entendi Luiz...

Você tem contigo alguma URL que mostra esse principio no site do Rails
ou equivalente? Quem sabe eu consigo assimilar mais coisas...

De qualquer forma, muitíssimo obrigado!

[ ]s

On 21 jun, 09:39, Luiz Costa <lhd...@gmail.com> wrote:
> Alessandro,
>
> Não posso afirmar se existe ou não outro jeito. Mas esta é a maneira como
> foi pensado para funcionar. E, conforme o princípio de Convention over
> Configuration do Rails, este deve ser o modo mais conveniente.
>

Rogerio Medeiros

unread,
Jun 21, 2011, 8:49:37 AM6/21/11
to rail...@googlegroups.com
Entao voce pode tratar isso no model do log com callbacks
Atenciosamente,

Rogerio
def sou_eu
    sou_eu = ''
    [82,117,98,121,32,68,101,118,101,108,111,112,101,114].each do |creu|
        sou_eu += creu.chr
    end
    sou_eu
end
sou_eu


Meu blog sobre rails http://argerim.wordpress.com

Alessandro

unread,
Jun 21, 2011, 8:51:40 AM6/21/11
to rails-br
Não sei Rogério... Acho que não é por ai segundo como foi arquitetado
o MVC... De qualquer maneira é uma idéia...

Brigadão

On 21 jun, 09:49, Rogerio Medeiros <arge...@gmail.com> wrote:
> Entao voce pode tratar isso no model do log com callbacks
>
> Meu blog sobre railshttp://argerim.wordpress.com

Luiz Costa

unread,
Jun 21, 2011, 9:02:48 AM6/21/11
to rail...@googlegroups.com
Oi, Alessandro

Você pode ver em detalhes qual o propósito dos controllers em: http://guides.rubyonrails.org/action_controller_overview.html

Eu recortei algumas passagens relevantes para o que você quer saber

O que faz um controller:
For most conventional RESTful applications, the controller will receive the request (this is invisible to you as the developer), fetch or save data from a model and use a view to create HTML output. If your controller needs to do things a little differently, that’s not a problem, this is just the most common way for a controller to work.

Métodos e ações:
A controller is a Ruby class which inherits from ApplicationController and has methods just like any other class. When your application receives a request, the routing will determine which controller and action to run, then Rails creates an instance of that controller and runs the method with the same name as the action.

Basicamente as ações são métodos que recebem uma requisição, fazem ou não interações com o Model, e geram uma saída. Os métodos auxiliares normalmente não são ações.

Tudo que estiver public em um controller é considerado uma ação, o que for protected ou private não é ação, o que é o caso dos métodos auxiliares e seria o caso se você implementasse o método como protected no ApplicationController.

Tem mais detalhes sobre o ActionController no link que eu coloquei ali em cima.

Abs.

Alessandro

unread,
Jun 21, 2011, 9:28:59 AM6/21/11
to rails-br
Luiz... Como dizem aqui em Sampa... VOCÊ É O CARA!!!

Muitíssimo obrigado pelo esclarecimento... Vou ler com muito carinho o
link que passou.

Testei também o que disse sobre colocar a função na
ApplicationController ou na ApplicationHelper. Só funcionou na
ApplicationController dado que, acredito eu, estou usando essa função
dentro de outros Controller. Se fosse usar essa mesma função em Views
acho que seria o caso de se colocá-la na ApplicationHelper.

Mais uma vez obrigado a você e a todos pela ótima troca de de
conhecimento. E "vamo q vamo"...

[ ]s
> ...
>
> mais »

Alessandro

unread,
Jun 21, 2011, 9:34:05 AM6/21/11
to rails-br
Apenas pra agregar a aqueles que quiserem saber mais como eu, achei
esse o mesmo artigo informado pelo Luiz Costa traduzido para o
português em:

http://guias.rubyonrails.pro.br/action_controller_overview.html#

[ ]s

On 21 jun, 10:02, Luiz Costa <lhd...@gmail.com> wrote:
> ...
>
> mais »

vitor francisco

unread,
Jun 21, 2011, 9:38:47 AM6/21/11
to rail...@googlegroups.com
Opa, vlw msm amigo vou dar uma olhada é bom msm.
Reply all
Reply to author
Forward
0 new messages