Rails: рендер и выход немедленно - PullRequest
32 голосов
/ 04 апреля 2011

Используя гем omniauth, я вынужден определить один обратный вызов маршрута для успешных входов в систему, независимо от поставщика:

def auth_callback 

        auth_data = request.env['omniauth.auth']

        if auth_data.has_key('something')
            process_one(auth_data)
        else
            process_two(auth_data)
        end

        # No view is available here

end


def process_one
    # do something then render view for process_one
    return
end

def process_two
    # do something then render view for process_two
    return
end

Как я могу предотвратить возврат контроллера к методу auth_callback и попытаться отобразить соответствующее представление (которого не существует)? Обработка должна считаться завершенной после возвращения методов process_one или process_two.

Ответы [ 2 ]

80 голосов
/ 04 апреля 2011

Почему бы специально не вызывать render в этих методах?

def process_one
 # do something then render view for process_one
 render :process_one and return
end

Rails должен обнаружить, что вы уже запустили его, и не пытаться выполнить рендеринг снова.

1 голос
/ 19 апреля 2018

Если вы хотите вернуться из цепочки методов, например,

def a
  ...
  b
  ...
  render "smth"
end
...
def b
  ...
  # render from some conditional from here
  ...
end

вызовет AbstractController::DoubleRenderError, что означает, что вы вызываете render дважды.

Вы можете прочитать это статья , чтобы узнать 4 способа справиться с такой ситуацией.

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