Preciso chamar a ação de criação no controlador A, do controlador B.
O motivo é que preciso redirecionar de maneira diferente quando estou ligando do controlador B.
Isso pode ser feito no Rails?
ruby-on-rails
ddayan
fonte
fonte
Respostas:
Você pode usar um redirecionamento para essa ação:
Mais em: Guia Rails
Para apenas renderizar a nova ação:
fonte
render
vez deredirect_to
. O que você acha, @Spyros?redirect_to
não permite usarpost: :method
e isso pode ser útil principalmente para redirecionar para umacreate
ação já existente de outro controlador como @ddayan perguntou na primeira vez. Tenho uma situação semelhante em que, em alguma situação, devo criar outro objeto. Chamar a outracreate
ação pode ser mais SECO ..Para usar um controlador de outro, faça o seguinte:
fonte
controller_you_want
você fariacontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)
parece funcionar para retornar JSON do outro controladorcontroller_you_want.request
mas não foi possível obter esse disparo passando uma instância de hash ou de parâmetros.params
se disponível aocontroller_you_want
definir orequest
na 3ª linha. É isso que você está perguntando?render html: controller_you_want.process(:action_you_want)
A lógica que você apresenta não é compatível com MVC, e nem com Rails.
Um controlador renderiza uma visualização ou redireciona
Um método executa código
A partir dessas considerações, aconselho você a criar métodos em seu controlador e chamá-los de sua ação.
Exemplo:
Dito isso, você pode fazer exatamente o mesmo por meio de controladores diferentes e invocar um método do controlador A enquanto estiver no controlador B.
O vocabulário é extremamente importante, por isso insisto muito.
fonte
get_variable
agora pode ser chamado de outro controlador?Você pode usar
url_for
para obter a URL de um controlador e ação e, em seguida, usarredirect_to
para ir para essa URL.fonte
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)
, resultará em/contorller_name/action_name?param1=val1¶m2=val2
. Veja os documentosEsta é uma prática inadequada para chamar outra ação do controlador.
Você deve
Minha opinião:
A terceira abordagem é o que eu costumava fazer com frequência. Então, vou mostrar um pequeno exemplo.
Portanto, você pode enviar para este
redirect_to
parâmetro de ação , que pode ser qualquer caminho que desejar.fonte
/models
ou uma classe ou módulo comum/lib
). O único problema é se o seu controlador se comunica com o modo de exibição por meio de variáveis de instância - você teria que consertar essa duplicação de outra maneira.Talvez a lógica pudesse ser extraída de um ajudante? os ajudantes estão disponíveis para todas as classes e não transferem o controle. Você pode verificar dentro dele, talvez o nome do controlador, para ver como foi chamado.
fonte
Composição para o resgate!
Dado o motivo, em vez de invocar ações entre controladores, deve-se projetar controladores para separar partes compartilhadas e personalizadas do código. Isso ajudará a evitar a duplicação de código e a quebra do padrão MVC.
Embora isso possa ser feito de várias maneiras, usar interesses ( composição ) é uma boa prática.
Espero que ajude.
fonte
Você pode chamar outra ação dentro de uma ação da seguinte maneira:
redirect_to action: 'action_name'
fonte
Separe essas funções dos controladores e coloque-as no arquivo de modelo. Em seguida, inclua o arquivo de modelo em seu controlador.
fonte