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
- duplicar esta acción en su controlador B, o
- envuélvalo como un método modelo, que se compartirá con todos los controladores, o
- puedes extender esta acción en el controlador A.
Mi opinión:
- El primer enfoque no es DRY, pero aún así es mejor que llamar para otra acción.
- El segundo enfoque es bueno y flexible.
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.