我想知道有没有办法为index&定义默认的respond_to;在Application Controller中显示操作,并能够在需要某些自定义的其他控制器中覆盖。
我认为通过一个例子会更容易。
我正在使用InheritedResources,CanCan / Authlogic和WickedPDF gems来生成我的pdf并授权用户。我想知道我是否可以干掉我的代码。
这就是我所拥有的
class ProductsController < InheritedResources::Base
load_and_authorize_resource
respond_to :html, :xml, :json, :pdf
def index
@products = Product.page(params[:page])
index! do |format|
format.pdf do
render :pdf => pdf_file_name,
:show_as_html => params[:debug].present?
end
end
end
def show
show! do |format|
format.pdf do
render :pdf => pdf_file_name,
:show_as_html => params[:debug].present?
end
end
end
end
class CustomersController < InheritedResources::Base
def index
index! do |format|
format.pdf do
render :pdf => pdf_file_name,
:show_as_html => params[:debug].present?
end
end
end
def show
show! do |format|
format.pdf do
render :pdf => pdf_file_name,
:show_as_html => params[:debug].present?
end
end
end
end
这很好用。但是我需要在每个我想生成pdf的控制器中定义format.pdf似乎是多余的。有没有办法将其移动到应用程序控制器或使用继承的资源指定某处,然后在每个控制器的基础上覆盖它?有任何想法吗?
谢谢
答案 0 :(得分:2)
好的,我为其他感兴趣的人提出了以下解决方案。
我想我可以添加一个继承自InheritedResources的控制器,它继承自ApplicationController,然后让我所有其他控制器继承它(除了一些将直接从应用程序控制器继承的特殊情况(如HomeController) ,除了索引之外没有任何其他操作,并且不依赖于任何特定模型) - 这样我可以定义某些默认值 - 我在所有控制器中使用,例如respond_to,并且仍然享受InheritedResources gem的好处
class DefaultInheritedResourcesController < InheritedResources::Base
# For CanCan authorization - pretty much makes it application wide, without the need
# to define it in each controller. Can still override it in ability.rb by making
# a resource readable to all users with a session.
# if user
# can :read, [Product]
# end
# Also for controllers that need special treatment, you can just inherit from ApplicationController
# and override with skip_authorization_check - but for my app it's rare (only HomeController),
# most of controllers deal with some kind of resource - so this is a useful convention for 99% of use cases.
load_and_authorize_resource
respond_to :html, :json, :xml, :pdf
# format pdf needs to be redefined on those actions where index! or show! are called.
def index
super do |format|
format.pdf do
render :pdf => pdf_file_name,
:show_as_html => params[:debug].present?
end
end
end
def show
super do |format|
format.pdf do
render :pdf => pdf_file_name,
:show_as_html => params[:debug].present?
end
end
end
end
然后在我的ProductController中我可以这样做(注意我的ProductController从哪里继承。
class ProductsController < DefaultInheritedResourcesController
def index
@products = Product.page(params[:page])
super
end
end
希望这会对某人有所帮助。