Как определить значение по умолчанию response_to для действия index & show в контроллере приложения?
Мне было интересно, есть ли способ определить по умолчанию 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 ответ
Хорошо, я нашел следующее решение для всех, кто заинтересован.
Я подумал, что могу добавить контроллер, который будет наследовать от 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
Надеюсь, это кому-нибудь поможет.