如何为索引和放大器定义默认的respond_to;在应用控制器中显示动作?

时间:2012-03-12 17:12:14

标签: ruby-on-rails inherited-resources wicked-pdf

我想知道有没有办法为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似乎是多余的。有没有办法将其移动到应用程序控制器或使用继承的资源指定某处,然后在每个控制器的基础上覆盖它?有任何想法吗?

谢谢

1 个答案:

答案 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

希望这会对某人有所帮助。