Rails: визуализация различных представлений для входа в систему в зависимости от сохраненного местоположения - PullRequest
1 голос
/ 08 декабря 2011

Я использую букмарклет, который загружает фрейм. Я использую устройство для аутентификации. Если iframe загружается и пытается выполнить действие «закладка», но требует проверки подлинности, он, очевидно, перенаправляет iframe на путь sign_in перед пересылкой на действие «bookmark». Я хочу, чтобы на этом этапе действие 'sessions/new' (страница входа в систему) отображалось с другим макетом, чтобы страница входа вписывалась в iframe. Однако Devise использует метод render_with_scopes вместо стандартного метода рендеринга, и передача параметра :layout => 'my_iframe_layout' не работает. Я попытался извлечь метод render_with_scope из файла модуля lib и поместить его в свой контроллер, но он вызвал ошибки в стеке, которые привели к сбою сервера.

Я думаю, что мне нужен метод контроллера сессий, который выглядит примерно так:

    def new
    resource = build_resource
    clean_up_passwords(resource)
    #test whether the destination of this request is the bookmark action (mapped to /add_site)
    if after_sign_in_path_for(resource)[0..8] == '/add_site'
      respond_with_navigational(resource, stub_options(resource)){ render_with_scope :new }
  :layout => "bookmark_layout"    
    else
      respond_with_navigational(resource, stub_options(resource)){ render_with_scope :new }
    end
end

Единственный хак, о котором я подумал, - это иметь специальный метод аутентификации для моего действия 'bookmark', который проверяет, что такое целевое действие, а затем аутентифицируется соответствующим образом, но это не выглядит СУХОЙ.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Таким образом, полное решение состояло в том, чтобы извлечь метод 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 для принятия опции макета, чтобы у меня не было двух версий одного и того же метода.

0 голосов
/ 08 декабря 2011

Попробуйте использовать пользовательский контроллер сессий и передать желаемую раскладку Rails devise Sessions Controller

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...