# 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
9 回答
您可以使用
url_for
获取控制器和操作的URL,然后使用redirect_to
转到该URL .也许逻辑可以被提取到帮手?所有类都可以使用帮助程序,并且不会转移控制权 . 您可以在其中检查,也许是控制器名称,以查看它是如何被调用的 .
你提出的逻辑不是MVC,而是Rails,兼容 .
控制器呈现视图或重定向
方法执行代码
从这些考虑,我建议您在控制器中创建方法并从您的操作中调用它们 .
例:
也就是说你可以通过不同的控制器做同样的事情,并在控制器B中从控制器A召唤一个方法 .
词汇非常重要,这就是我坚持的原因 .
您可以在操作中调用另一个操作,如下所示:
redirect_to action:'action_name'
Composition救援!
鉴于原因,不应该跨控制器调用操作,而应设计控制器以分离代码的共享和自定义部分 . 这将有助于避免代码重复和破坏MVC模式 .
虽然可以通过多种方式完成,但使用问题(composition)是一种很好的做法 .
希望有所帮助 .
您可以使用重定向到该操作:
更多信息:Rails Guide
要呈现新动作:
调用另一个控制器操作是不好的做法 .
你应该
在控制器B中复制此操作,或
将其包装为模型方法,将与所有控制器共享,或者
您可以在控制器A中扩展此操作 .
我的看法:
第一种方法不是DRY,但它仍然比要求另一种行动更好 .
第二种方法是好的和灵活的 .
第三种方法是我过去常常做的事情 . 所以我会举一些例子 .
所以你可以发送到这个动作
redirect_to
param,它可以是你想要的任何路径 .要使用另一个控制器,请执行以下操作:
将这些功能与控制器分开并将它们放入模型文件中 . 然后在控制器中包含模型文件 .