Рубиновый шаблон на пути - PullRequest
0 голосов
/ 22 апреля 2019

Следующий рубиновый код для хранения предыдущего URL предназначен для исключения определенной серии, в которой конечное действие может отправить пользователя в бесконечный цикл.

  def current_user_url   # store last url 
    if (request.fullpath != "/users/sign_in?locale=*" &&
        request.fullpath != "/users/sign_up?locale=*" &&
        request.fullpath != "/users/password?locale=*" &&
        request.fullpath != "/users/sign_out?locale=*" &&
        request.fullpath != "/users?locale=*" &&
        !request.xhr?) # don't store ajax calls
      session[:previous_url] = request.fullpath 
    end
  end

при обработке действий со ссылками на себя

def after_sign_in_path_for(resource)
  session[:previous_url] || session[:confirm_url]
end

Подстановочный знак не работает должным образом, так как переменная сеанса хранит, например, /users/sign_in?locale=en, несмотря на использование подстановочного знака. примечание: без использования ?locale=en функция работает должным образом.

Как этот код может стать независимым от локали?

Обновление с примечанием о решении

В случае, если кто-то заскочит и взволнован вторым аплодисментом вики для драгоценного камня для разработки , вы не одиноки. Я не был слишком взволнован инстинктивно с фильтром после. Копаться в методе определения местоположения магазина в Devise можно, хотя и не так просто, как решение Макса ниже.

Это требует небольшой настройки, хотя (и [хм, да] вопрос не затрагивал devise) , где маршруты должны вызывать devise_for, а контроллер должен наследовать от devise

 devise_for :users, :controllers => { registrations: 'registrations', sessions: 'sessions' } 

class SessionsController < Devise::SessionsController
  skip_before_action :store_location 
end

Мне кажется, это чище, время обслуживания ...

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Вместо request.full_path вы можете использовать request.path, который не включает строку запроса.

Но лучшим решением в целом является просто пропуск обратного вызова для задействованных контроллеров / действий, поскольку это правильно распределяет обязанности.

class ApplicationController < ActionController::Base
  before_action :store_location
  def store_location
    session[:previous_url] = request.fullpath 
  end 
end

class SessionsController < ApplicationController
  skip_before_action :store_location
end

class UsersController < ApplicationController
  skip_before_action :store_location, only: :index
end
0 голосов
/ 22 апреля 2019

Подстановочные знаки не работают при сравнении строк, которые являются просто прямыми символьными проверками равенства.

Вам необходимо использовать регулярное выражение и проверить на match или используйте String#[]:

if (!request.fullpath[%r{\A/users/sign_in\?locale=.*\z}] &&
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...