Spy*_*ros 63
您可以使用重定向到该操作:
redirect_to your_controller_action_url
Run Code Online (Sandbox Code Playgroud)
更多信息:Rails指南
要呈现新动作:
redirect_to your_controller_action_url and return
Run Code Online (Sandbox Code Playgroud)
Sam*_*rbi 46
要使用另一个控制器,请执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
apn*_*ing 40
你提出的逻辑不是MVC,而是Rails,兼容.
控制器呈现视图或重定向
方法执行代码
从这些考虑,我建议您在控制器中创建方法并从您的操作中调用它们.
例:
def index
get_variable
end
private
def get_variable
@var = Var.all
end
Run Code Online (Sandbox Code Playgroud)
也就是说你可以通过不同的控制器做同样的事情,并在控制器B中召唤控制器A 的方法.
词汇非常重要,这就是我坚持的原因.
aus*_*tin 30
您可以使用url_for获取控制器和操作的URL,然后使用redirect_to该URL转到该URL.
redirect_to url_for(:controller => :controller_name, :action => :action_name)
Run Code Online (Sandbox Code Playgroud)
fl0*_*00r 12
调用另一个控制器操作是不好的做法.
你应该
我的看法:
第三种方法是我过去经常做的事情.所以我会举一些例子.
def create
@my_obj = MyModel.new(params[:my_model])
if @my_obj.save
redirect_to params[:redirect_to] || some_default_path
end
end
Run Code Online (Sandbox Code Playgroud)所以你可以发送到这个动作redirect_to参数,它可以是你想要的任何路径.
组成救援!
鉴于原因,不应该跨控制器调用操作,而应设计控制器以分离代码的共享和自定义部分.这将有助于避免代码重复和破坏MVC模式.
尽管可以通过多种方式完成,但使用关注点(组合)是一种很好的做法.
# 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
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.