2

Скажем, у меня есть сайт Rails 4.2 на Heroku со многими сообщениями. Когда сообщение просматривается, приложение попадает в базу данных, чтобы получить данные и связанные данные из других моделей. Посетители (не зарегистрированные пользователи) на мой сайт должны видеть сообщения без каких-либо настроек, поэтому отображение этих страниц не должно требовать доступа к базе данных. Как я могу настроить простую страницу или кеширование действий (или эквивалент) для всех посетителей на моем сайте, чтобы база данных была пропущена? Могу ли я также позволить CDN взять на себя эти страницы?Как добавить кеширование страницы в приложение Rails для посетителей?

ответ

3

Для начала взгляните на the Rails caching guide. Как кеширование страницы, так и действие были удалены из Rails.

Вы можете попробовать фрагментировать кеширование, которое захватит сгенерированный HTML-сообщение и сохранит его, хотя вам понадобится условное условие, основанное на том, есть ли current_user.

супер-простой вариант может выглядеть следующим образом:

приложение/просмотров/сообщений/show.html.erb

<% cache_unless (current_user, @post) do %> 
    <%= @post.body %> 
<% end %> 

Метод cache собирается быть чтения действие, если для этого сообщения существует кеш, и он будет генерировать и записывать действие, если этот кеш не существует.

Кэширование с помощью объекта ActiveRecord создает ключ, который включает в себя updated_at по умолчанию, поэтому, если сообщение изменяется, первый посетитель, который загружает сообщение, будет иметь более длительное время ожидания, и каждый последующий посетитель получит преимущества кэширования.

Что касается вашего другого вопроса, существует множество других инструментов на основе Ruby для обслуживания статических страниц, и обзор всех этих вопросов мне незнает и, вероятно, выходит за рамки этого вопроса. :)

0

Вы действительно не хотите кешировать здесь. Вы просто хотите условное как в контроллер и вид, как

# controller 
if logged_in? 
    @post = Post.find(params[:id]) 
    # load more records 
end 

# view 
<% if @post %> 
    <%= @post.title %> 
    ... 
<% else %> 
    You're not logged in, blah blah. 
<% end %> 

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

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

<% cache "post-#{@post.id}-#{current_user ? current_user.id : 0}" do %> 
    <% if logged_in? %> 
    ... # expensive operations 
    <% else %> 
    Please login to see more.. 
    <% end %> 
<% end %> 

так, что кэш работает с тем же кодом для пользователей или Анонс , Ответ

1

Лэнни Бозе действительно выглядит лучше, но я добавлю эту ссылку:

https://devcenter.heroku.com/articles/http-caching-ruby-rails#public-requests

Вся страница полезна, но, в частности, говорится о маркировке запросов как государственные или частные. По умолчанию они являются закрытыми, но если вы помечаете его как общедоступное, он позволяет страницам обслуживаться промежуточным прокси-кешем.

Связанная страница рассказывает о Rack :: Cache + memcache как кэш-прокси; Я не уверен, что это все еще существует в рельсах 4.

Это вторая Heroku страница говорит о кэшировании действий, которые могли бы кэшировать конкретные действия для вас:

https://devcenter.heroku.com/articles/caching-strategies#action-caching

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