几个问题:
是否可以在辅助模块中调用控制器方法(例如,应用程序助手)?
如果是这样,帮助程序如何处理视图的呈现?忽略它?
在什么情况下你想从帮助者调用控制器方法?这是不好的做法吗?
您是否有任何示例代码在helper中调用控制器方法?
答案 0 :(得分:13)
您通常不会从帮助程序调用控制器方法。也就是说:如果你的意思是一种收集数据然后呈现视图的方法(任何其他需要调用的方法可能不应该在控制器中)。 这绝对是不好的做法,并打破了MVC。
然而,完全可以在视图中使用控制器方法,例如current_user
方法就是一个很好的例子。
要使视图中的控制器方法可用,作为辅助方法,只需执行
private
def current_user
# do something sensible here
@current_user ||= session[:user]
end
helper_method :current_user
这种方法最好在private
部分中定义,或者可以作为操作提供(如果您在路由中使用通配符)。
答案 1 :(得分:9)
在相应的控制器上声明您的方法
private
def method_name1
...
end
def method_name2
...
end
在控制器的头部声明
helper_method :method_name1, :method_name2
您可能希望在私有状态下声明这些方法
就是这样,现在你可以在助手上使用你的方法了
答案 2 :(得分:0)
从帮助程序调用控制器违反了MVC模式。 IMO如果你需要从Rails视图助手(如application_helper
)调用控制器,那么可以改进设计。目的是帮助者“帮助”观点,因此只与模型交谈。
我不打算在这里捍卫MVC(网上有大量的引用),但是这个关于从视图中调用控制器的SO线程应该让你开始。
Calling controller from view?(请注意,这是一个ASP.NET线程,因此只有高级原则才相关)。