Таким образом, полное решение состояло в том, чтобы извлечь метод render_with_scopes
из его lib-файла, переименовать его и поместить в контроллер приложений (а не в контроллер сессий, как я делал раньше).В метод был добавлен параметр :layout => 'bookmark_layout
.
def render_with_scope_bookmark(action, path=self.controller_path)
if self.class.scoped_views?
begin
render :template => "#{devise_mapping.scoped_path}/#{path.split("/").last}/#{action}", :layout => 'bookmark_layout'
rescue ActionView::MissingTemplate
render :template => "#{path}/#{action}", :layout => 'bookmark_layout'
end
else
render :template => "#{path}/#{action}", :layout => 'bookmark_layout'
end
end
Затем я изменил контроллер сессий так, чтобы новый метод render_with_scopes_bookmark
вызывался, когда моя закладка обращалась к действию sessions/new
.Оригинальный метод render_with_scope
используется, когда основной сайт получает доступ к действию.Мой букмарклет всегда попадает в папку '/ add_site', поэтому для тестирования я использую session[:resource_return_to]
(в моем случае ресурс - пользовательский).stored_location
и after_signin_path
- это методы для получения конечного пункта назначения запроса, а затем сброса переменной session[:resource_return_to]
, поэтому ни один из них не подходит для проверки пункта назначения.
def new
resource = build_resource
clean_up_passwords(resource)
@location = session[:user_return_to]
if @location == nil
respond_with_navigational(resource, stub_options(resource)){ render_with_scope :new }
elsif @location[0..8] == '/add_site'
respond_with_navigational(resource, stub_options(resource)){ render_with_scope_bookmark :new }
else
respond_with_navigational(resource, stub_options(resource)){ render_with_scope :new }
end
end
Мой следующий шаг будетизменить метод render_with_scopes
для принятия опции макета, чтобы у меня не было двух версий одного и того же метода.