我的应用程序控制器中有此方法,该方法为相应的用户类型呈现视图模板。
class ApplicationController < ActionController::Base
def render_for_user
view = caller_locations.first.label
if current_user.blank?
render "#{view}_guest"
else
render "#{view}_#{current_user.role.downcase}"
end
end
end
我以以下方式调用此方法:
Class CommentController < ActionController::Base
def show
@comment = Comment.find(params[:id])
render_for_user
end
end
我遇到麻烦的地方是从respond_to
块内部调用此方法。这是一个示例:
Class CommentController < ActionController::Base
def show
@comment = Comment.find(params[:id])
respond_to do |format|
format.js
format.html { render_for_user }
end
end
end
由于应用程序控制器中的控制器方法只是将调用方法的名称向上一级获取,因此它被response_to块击败了。
我的问题是:查看上面的代码,是否有更好,更灵活的方法来获取调用控制器方法?
答案 0 :(得分:3)
我的问题是:查看上面的代码,是否有更好,更灵活的方法来获取调用控制器方法?
controller_name
将返回name.demodulize.sub(/Controller$/, '').underscore
,这可能是您想要的。我从未见过有人需要使用caller_location。同样,有action_name
还有params[:controller]
和params[:action]