rutas relaciones rails proyecto primer paso modelos iniciando formulario crear controlador con ruby-on-rails

ruby-on-rails - relaciones - ruby on rails crear formulario



Rieles: llamar a otra acción del controlador desde un controlador (9)

Esta es una mala práctica llamar a otra acción del controlador.

Debieras

  1. duplicar esta acción en su controlador B, o
  2. envuélvalo como un método modelo, que se compartirá con todos los controladores, o
  3. puedes extender esta acción en el controlador A.

Mi opinión:

  1. El primer enfoque no es DRY, pero aún así es mejor que llamar para otra acción.
  2. El segundo enfoque es bueno y flexible.
  3. El tercer enfoque es lo que solía hacer a menudo. Entonces mostraré un pequeño ejemplo.

    def create @my_obj = MyModel.new(params[:my_model]) if @my_obj.save redirect_to params[:redirect_to] || some_default_path end end

De modo que puede enviar esta acción a redirect_to param, que puede ser cualquier ruta que desee.

Necesito llamar a la acción create en el controlador A, desde el controlador B.

La razón es que necesito redirigir de manera diferente cuando estoy llamando desde el controlador B.

¿Se puede hacer en Rails?


La lógica que presenta no es MVC, entonces no es Rails, es compatible.

  • Un controlador representa una vista o redirige

  • Un método ejecuta código

A partir de estas consideraciones, le aconsejo que cree métodos en su controlador y los llame desde su acción.

Ejemplo:

def index get_variable end private def get_variable @var = Var.all end

Dicho esto, puedes hacer exactamente lo mismo a través de diferentes controladores y convocar un método desde el controlador A mientras estás en el controlador B.

El vocabulario es extremadamente importante, es por eso que insisto mucho.


Para usar un controlador de otro, haga esto:

def action_that_calls_one_from_another_controller controller_you_want = ControllerYouWant.new controller_you_want.request = request controller_you_want.response = response controller_you_want.action_you_want end


Puede llamar a otra acción dentro de una acción de la siguiente manera:

redirect_to action: ''action_name''

class MyController < ApplicationController def action1 redirect_to action: ''action2'' end def action2 end end


Puede usar url_for para obtener la URL de un controlador y acción y luego usar redirect_to para ir a esa URL.

redirect_to url_for(:controller => :controller_name, :action => :action_name)


Puede usar un redireccionamiento a esa acción:

redirect_to your_controller_action_url

Más sobre: Guía de carriles

Para simplemente renderizar la nueva acción:

redirect_to your_controller_action_url and return


Separe estas funciones de los controladores y colóquelas en el archivo de modelo. Luego incluye el archivo de modelo en tu controlador.


Tal vez la lógica podría ser extraída en un ayudante? los ayudantes están disponibles para todas las clases y no transfieren el control. Podrías verificar dentro de él, quizás por el nombre del controlador, para ver cómo se llamó.


Composition para el rescate!

Dada la razón, en lugar de invocar acciones entre los controladores, uno debe diseñar los controladores para separar las partes compartidas y personalizadas del código. Esto ayudará a evitar ambos: duplicación de código y ruptura del patrón MVC.

Aunque se puede hacer de varias maneras, usar preocupaciones ( Composition ) es una buena práctica.

# controllers/a_controller.rb class AController < ApplicationController include Createable private def redirect_url ''one/url'' end end # controllers/b_controller.rb class BController < ApplicationController include Createable private def redirect_url ''another/url'' end end # controllers/concerns/createable.rb module Createable def create do_usefull_things redirect_to redirect_url end end

Espero que ayude.