假设我有一个图书馆控制器和书籍控制器。
library_controller.rb的一部分:
def report
#some code here
end
books_controller.rb的一部分:
def create
@library.report
end
是否可以调用另一个控制器的方法?如果没有,如何在创建一本书后使库生成某种报告。
答案 0 :(得分:1)
这可能是丑陋的hackery,但你不应该这样做。您可以向其他控制器发出redirect。您应该在URL中传递您需要的所有参数。
class BooksController < ApplicationController
def create
# ...
redirect_to report_library_path(param: :foo)
end
end
如果您有应该共享的功能。例如,假设您要生成书籍报告,那么您应该将此常用功能提取到关注点并将其混合到控制器中。
# app/concerns/reports.rb
module Reports
extend ActiveSupport::Concern
def generate_report
# do stuff here
end
end
现在,您可以将其混合到控制器中,并使用您编写的generate_report
方法。
class BooksController < ApplicationController
include Report
def create
end
end
class LibrariesController < ApplicationController
include Report
def report
end
end
答案 1 :(得分:1)
不,你不能调用不同的控制器方法,你不应该。但是,您可以将方法放入ApplicationController,这意味着它们被所有其他控制器继承。
然而,在你的代码中,看起来你试图在模型对象上调用实例方法,假设它是@report
,那不是控制器方法
答案 2 :(得分:1)
您不想创建调用另一个控制器操作的控制器操作。这是可能的(正如穆罕默德所说,丑陋的hackery),但会给你带来很多问题。从一个控制器操作跳转到另一个控制器操作的唯一真正可接受的方法是通过redirect_to
,这不会解决您描述的问题。
在MVC框架(例如rails)中,您要做的是将report#create
操作的重用部分移动到reprt 模型,以及然后从report#create
和book#create
引用此内容。这可以是Report.define_report( my_params )
之类的方法,也可以只是现有的Report.create()
方法。
您描述的行为属于模型中的行为。控制器应该只是调用它,因为控制器的目的通常是设置视图。
<强>参考文献:强>