0

Так часто у меня есть форма на какой-либо веб-странице, которую пользователь отправляет в POST, PUT или DELETE действие в Rails, где я хочу, чтобы он перенаправлялся к указанному URL-адресу, если представление было успех. Я обычно делаю скрытый дополнительный параметр, называемый to с дорожкой, как /users. Поэтому, если представление формы завершилось неудачно, оно просто останется в этой форме, но если это удастся, браузер будет перенаправлен на /users.Перенаправление на указанный URL-адрес после POST в Rails

Я хотел бы автоматически искать этот параметр и всегда перенаправлять на нее, если представление формы удалось любой контроллер/действие. Я помещаю это в ApplicationController в after_action?

class ApplicationController < ActionController::Base 
    after_action :redirect_if_success 

    private 
    def redirect_if_success 
    redirect_to params[:to] if params[:to] 
    end 
end 

Я думаю, что я могу проверить объект запроса, если это было POST, PUT или DELETE. Как я знаю, что представление было успешным? Будет ли redirect_to в after_action переопределить любые redirect_to s в контроллере формы?

ответ

0

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

class ApplicationController < ActionController::Base 

    private 
    def redirect_if_success(default_ur) 
    redirect_to params[:to] || default_url 
    # or similar logic 
    end 
end 

class UserController < ApplicationController::Base 

    def create 
    redirect_if_success("/users") if @user.save 
    end 
end 
0

Я хотел бы создать вспомогательный метод

def redirect_to_location 
    redirect_to params[:to] && params[:to].present? 
end 

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

Однако вы могли бы немного поэкспериментировать. Чтобы сохранить эту логику в after_action, вам нужно настроить какое-то состояние, которое сообщит вам, нужно ли перенаправить или нет.

Вы можете сделать:

def save 
    if @user.save 
    @follow_redirect = true 
    end 
end 

и проверить @follow_redirect флаг в after_action фильтре. Не похоже, что это очень красивое решение, но оно будет работать.

Вы также можете попробовать, чтобы проверить переменную отклика, чтобы увидеть, если вы уже перенаправляется или оказали действие: (не уверен, если это будет работать, но это весело экспериментировать)

Таким образом, вы можете проверить:

если вам нужно перенаправить (действие - post/put/delete), а params [: to] присутствует и , если вы еще не перенаправлены/перенаправлены

# this is not a copy-paste code but rather to demonstrate an idea 
class ApplicationController < ActionController::Base 
    after_action :redirect_to_location 

    protected 

    def is_redirectable? 
    %w{post put delete}.include?(request.method) && params[:to].present? 
    end 

    def already_redirected? 
    !response.status.nil? # not sure if it would work at all 
    end 

    def redirect_to_location 
    redirect_to params[:to] if is_redirectable? && !already_redirected? 
    end 
end