Перенаправление от действия обновления к рефереру редактирования - PullRequest
3 голосов
/ 13 марта 2010

Приложение My Rails 2.3 имеет пользовательскую модель и обычные действия контроллера. Форма редактирования может быть доступна двумя способами: когда пользователь редактирует свой собственный профиль с домашней страницы, или когда пользователь-администратор редактирует чужой профиль из коллекции пользователей.

То, что я хотел бы сделать, это перенаправить действие обновления обратно на указанное действие редактирования, а не действие обновления. Если я выполняю простой redirect_to (: back) в рамках обновления, он возвращается к форме редактирования - не хорошо.

Одно из решений - полностью забыть о реферерах и перенаправлении на основе current_user и обновленного пользователя: если они одинаковые, вернитесь на домашнюю страницу, в противном случае перейдите на страницу сбора пользователей. Это сломается, если я когда-нибудь добавлю третий путь к форме редактирования. Сомнительно, что я когда-нибудь сделаю это, но я бы предпочел решение, которое не было бы таким хрупким.

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

Есть ли лучшие подходы? Или я должен перестать беспокоиться и пойти с одним из двух, которые я упомянул?

1 Ответ

5 голосов
/ 13 марта 2010

Вы можете запомнить URL в сеансе. Вот как я реализовал эту функцию в своем приложении.

Добавьте эти методы в свой ApplicationController

def store_location location=nil
    session[:return_to] = location || request.request_uri
end

def redirect_back_or_default(default)
    redirect_to(session[:return_to] || default)
    session[:return_to] = nil
end

def http_referrer
  http_referer, request_path  = request.env["HTTP_REFERER"], 
                                request.env["REQUEST_PATH"]
  return nil  unless (http_referer and request_path and 
                      http_referer =~ Regexp.new("^#{SITE_ROOT}") and
                      http_referer != (SITE_ROOT + request_path))
  return http_referer    
end

В UserController edit/new сохраняются действия реферера.

before_filter :store_location, :only => [:new, :edit]

def store_location
  super http_referrer
end

В UserController create/update действие возврата и сброса реферера.

def create
  if @user.save
    flash[:notice] = "Successfully created the user."
    redirect_back_or_default root_url
  else
    render :action => 'new'
  end
end    

def update
  if @user.save
    flash[:notice] = "Successfully created the user."
    redirect_back_or_default root_url
  else
    render :action => 'new'
  end
end    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...