Как определить значение по умолчанию response_to для действия index & show в контроллере приложения? - PullRequest
2 голосов
/ 12 марта 2012

Мне было интересно, есть ли способ определить по умолчанию response_to для действий index & show в Application Controller с возможностью переопределения в других контроллерах, которые нуждаются в некоторой настройке.

Я думаю, что будет легче с примером.

Я использую драгоценные камни InheritedResources, CanCan / Authlogic и WickedPDF для создания моего 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

Это работает просто отлично. Но кажется излишним, что мне нужно определить format.pdf в каждом контроллере, для которого я хочу сгенерировать pdf. Есть ли способ переместить это в контроллер приложения или указать где-нибудь, используя унаследованные ресурсы, а затем просто переопределить это для каждого контроллера? Есть идеи?

Спасибо

1 Ответ

2 голосов
/ 13 марта 2012

Хорошо, я придумала следующее решение для всех, кто интересуется.

Я подумал, что могу добавить контроллер, который будет наследовать от InheritedResources, который наследует от ApplicationController, а затем все остальные мои контроллеры наследуют от него (за исключением пары особых случаев, которые будут наследоваться непосредственно от контроллера приложения (например, HomeController). , который не имеет никаких действий, кроме index, и не привязан к какой-либо конкретной модели) - таким образом я могу определять определенные значения по умолчанию - которые я продолжаю использовать во всех моих контроллерах, таких как response_to, и все еще пользоваться преимуществами гема InheritedResources .

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

Надеюсь, это кому-нибудь поможет.

...