2013-06-17 2 views
3

Я пытаюсь сохранить предыдущую URL в сессии, я в настоящее время этот код:Игнорировать URI (request.referer) .path для предыдущего URL при посещении непосредственно на страницу

after_filter "save_my_previous_url", only: [:renderForm, :renderQuote] 

def save_my_previous_url 
    if URI(request.referer).path 
    session[:my_previouse_url] = URI(request.referer).path 
    else 
    session[:my_previouse_url] = URI(request.referer).path 
    end 
end 

Это работает, когда вы идете со страницы, в форме, затем к странице благодарности, но если вы идете прямо к форме непосредственно вместо того, чтобы нажать на ссылку, я получаю эту ошибку:

bad argument (expected URI object or URI string) 

Так что мне нужно, как некоторые игнорируйте это, когда нет предыдущего URL-адреса.

ответ

0

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

def save_my_previous_url 
    if request.referer.present? 
    session[:my_previouse_url] = URI((request.referer || "")).path 
    else 
    session[:my_previouse_url] = URI((request.referer || "")).path 
    end 
end 

Объяснение: Методика здесь, чтобы предположить, что в худшем случае, мы возвращаем ноль из request.referer вызова метода. Таким образом, всякий раз, когда вы передаете нулевое значение в функцию и знать, что следующий вызов метода взорвется, передать этот фрагмент в качестве аргумента:

(@variable || "whatever_value_needed") 

#alternatively: 
(method_call || "whatever_value_needed") 

В этом случае «whatever_value_needed» должна быть пустой строкой.

Этот метод работает, потому что метод метода request.referer сначала получает значение nil, а точнее логическое значение false. Затем из-за «или» || оператор, вычисляется второй операнд, который в этом случае равен "". Затем создается экземпляр объекта URI, потому что он принимает пустую строку в качестве аргумента, и все вызовы методов этого нового объекта будут работать (... не выдавать исключение).

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

+0

Удивительный ... спасибо :) – Bongs

+0

URI (request.referer) выдаст ошибку, когда реферер равен нулю или недействительным. См. Мой ответ ниже. – tomf

+0

Вы прочитали мой ответ? использование 'begin' является полным излишеством здесь. Это совсем не изящно. – mkralla11

0

Вы должны убедиться, что вы регулируете как ноль ссылающейся и реферрера которые URL-адреса не может разобрать (например, URL, как http://x.com?utm_term=a|b - «|» вызывает синтаксический анализ на неудачу, по крайней мере, в некоторых вариантах руб).

Этот код (или нечто подобное) работает для меня:

begin 
    if request.referer.present? && URI.parse(request.referer).path 
     session[:my_previouse_url] = URI(request.referer).path 
    else 
     session[:my_previouse_url]=nil; 
    end 
rescue URI::Error => e 
    session[:my_previouse_url]=nil; 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^