написание метода мета-обновления для рельсов - PullRequest
2 голосов
/ 31 января 2010

Мне нужен метод в app / controllers / application.rb, который может добавлять / добавлять текст к любому отображаемому шаблону. Конечно, я не могу вызвать рендер дважды без получения двойной ошибки рендеринга, так возможно ли это?

Я хочу перенаправить после задержки, используя метаобновление. Вот что у меня есть:

приложение / контроллеры / application_controller.rb:

def redirect_after_delay (url, delay)
  @redirect_delay = delay
  @redirect_url = url
  render
end

приложение / просмотров / макеты / application.html.erb

<!DOCTYPE html>
<html lang="en">
  <head>
    <%= yield :refresh_tag %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

Итак, если я хочу добавить перенаправление после задержки, я добавляю следующее к 1) моему контроллеру и 2) представлению действия:
приложение / контроллеры / my_controller.rb

def my_action
  redirect_after_delay 'http://www.google.com', 3 if some_condition
end

приложение / просмотров / my_controller / my_action.html.erb

<% content_for :refresh_tag do %>
  <meta http-equiv='refresh' content='<%=@redirect_delay%>;url=<%=@redirect_url%>'>
<% end %>
<h1>Please wait while you are redirected...</h1>

Поскольку блок content_for никогда не изменяется, возможно ли сделать это каким-либо общим способом, чтобы мне не нужно было вставлять <%= yield :refresh_tag %> в каждый шаблон? (например, может redirect_after_delay добавить его в любой шаблон, который будет отображаться?)

Ответы [ 3 ]

1 голос
/ 30 декабря 2010

@ aaronstacy

Я искал ту же функциональность, поэтому позаимствовал и усовершенствовал ваш подход. Просто:

в app / controllers / application_controller.rb:

    def redirect_with_delay(url, delay = 0)
      @redirect_url, @redirect_delay = url, delay
      render
    end

в app / views / layouts / application.html.erb:

<html>
  <head>
    [snip...]
    <% if @redirect_url %>
    <meta http-equiv='refresh' content='<%= @redirect_delay -%>;url=<%= @redirect_url -%>'>
    <% end %>
    [snip...]
  </head>
  [etc...]

Это делает redirect_with_delay () доступным с любого контроллера и в любом представлении. Работает как чемпион - спасибо за вдохновение.

1 голос
/ 27 апреля 2015

Вам не нужно ничего вставлять в HTML и беспокоиться о шаблонах. Метатег эквивалентен заголовку HTTP, который действительно легко отправить с помощью Rails, например, в вашем контроллере:

def my_action
  header['Refresh'] = "5"
  render :my_view
end

Или вы можете преобразовать это в метод в ApplicationController

def redirect_after_relay(url, delay)
  header['Refresh'] = "#{delay}; url=#{url}"
end
0 голосов
/ 31 января 2010

Одной из идей является использование after_filter в application_controller.rb для добавления мета-тега обновления при необходимости, например,

def after_filter
  if @redirect_url and @refresh_delay
    # update controller.response.body to add meta refresh tag
  end
end

Я не уверен, что это будет так же эффективно, как использование yield :refresh_tag, поскольку вам придется анализировать HTML-код, чтобы вставить тег meta после тега head, но это возможный подход для исследования. 1009 *

Другой идеей было бы просто поместить заголовок HTML в часть, которую вы затем включаете в другие ваши страницы. например,

Заголовок частичный:

<!DOCTYPE html>
<html lang="en">
  <head>
    <%= yield :refresh_tag %>
  </head>

Нижний колонтитул:

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