Activity
One cool thing is we also could use layouts. It is possible to create a layout app/views/layouts/application.turbo_stream.erb
and manage the code related to flash messages once for all turbo stream response. (Don't forget to use yield
😅)
<%= turbo_stream.prepend :flashes partial: "shared/flashes" %>
<%= yield %>
You're welcome :)
About https://github.com/brandoncc/heroku-buildpack-vips/blob/master/bin/compile#L52. It's more because we don't really know the author and what could contain https://bc-heroku-buildpacks.s3.amazonaws.com/vips/libvips-$VIPS_VERSION-$HEROKU_STACK.tar.gz. But that's only my point of view.
On one of our project, hosted on Heroku in production, We only have config.assets.css_compressor = :sass
commented. And config.assets.js_compressor = Uglifier.new(harmony: true)
is not commented.
Not sure but this may be related to sprockets
that is no longuer installed with Rails 6, since webpacker is now the default. (https://github.com/rails/rails/pull/33079)
Does https://github.com/brandoncc/heroku-buildpack-vips.git really required?
I'll be not really confident with this line https://github.com/brandoncc/heroku-buildpack-vips/blob/master/bin/compile#L52.
The VIPS part now works with Heroku, but I'm still struggling with some bug. For some reason my CSS and JS files are not loading on Heroku, but they are loading fine locally.
What kind of error do you have? Assets returns 404? All assets?
Does your app is configured with RAILS_ENV=production
in environment variables?
I guess you could use https://github.com/heroku/heroku-buildpack-apt.
So finally what I would like, is to know the view name of the view called in the action controller.
I try to create a small view helper to manage content for `<title>`.
module ApplicationHelper def page_title(options = {}) app_name = Rails.application.class.to_s.split("::").first key = "#{controller_name}.#{action_name}.title" title = content_for(:page_title) || t(key, default: "") [app_name, title].join(" : ") end end
I use high_voltage gem. If I do `t(".title")` it attempt to call `en.pages.about.title` and in my helper it attempt to call `en.pages.show.title`.
I try to found a method to use instead `action_name` to get `about` instead `show` but I didn't found.
I looked the rails code and found this method is used, but I can't access to the `@virtual_path`.
I think there is a proper way to do this, but I didn't found for now.
Does somebody has any idea?
Thanks!
Posted in `fresh_when` usage for dynamic queries
I tried and yes if I use a static Time the query stay the so ETag
too. That's how I discovered why my ETag
was always different.
But anyway if I have a query without something variable like my Time.now
it mean that if I update a Post
the ETag
will stay the same. And that's not logic.
Posted in `fresh_when` usage for dynamic queries
Hi Jacob,
I'm using Rails 5.0.2
. Yes, I saw in their doc that they speak about using fresh_when
for collections: http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when.
With the example of your link, it works because Post.all
will always generate the same query. And by checking how the Rails code works, I saw they call cache_key
method who generated a string key in function of the SQL query.
In my case, because of Time.now
, the SQL query is always different. So, the ETag
too...
That's why I don't know if it is a problem of usage or a problem onto Rails code.
Posted in `fresh_when` usage for dynamic queries
Hey!
I'm recently looking to use fresh_when
method on my PostController
.
class PostsController < ApplicationController
def index
@posts = Post.published.order(published_at: :desc)
fresh_when @posts
end
def show
@post = Post.published.find(params[:id])
fresh_when @post
end
end
class Post < ApplicationRecord
scope :published, -> { where("published_at IS NOT NULL AND published_at <= ?", Time.now) }
scope :unpublished, -> { where("published_at IS NULL OR published_at > ?", Time.now) }
end
All is good for the show
method, ETag
and Last-Modified
headers looks good.
But it's not the case for the index
method. Each request the ETag
is not the same.
I took a look at Rails code and I discover that the ETag
generation is done by generate_strong_etag
who call a bit later retrieve_cache_key
.
In index
action @posts
return an ActiveRecord::Relation
object who reponds to cache_key
method. And this method return a key based on the sql request.
So because of the Time.now
usage, all requests are different ...
I resolve the problem by doing this:
fresh_when @posts, etag: @posts.to_a
But I'm not sure if it is the best way to do this.
That's why I asking you here :)
SEEKING WORK. Located in France. Remote work
I'm Ruby on Rails developer with +5 years of experience in web development.
I've some basics on DevOps.
I use: Ruby, Ruby on Rails, RSpec, PostgreSQL, SCSS, memcached, GitLab (+ GitLab CI), capistrano and auto-deployment, vagrant.
email: nicolas@pantographe.studio
website: http://nicolas-brousse.fr
Posted in Caching static pages without CSRF token
Great!
I'll keep CSRF token for static pages then.
Thanks for your help!
Posted in Caching static pages without CSRF token
Hi Chris,
Thanks for your answer and sorry for the time I spent to send mine.
In my case I'm looking for caching a full-page. My website doesn't contain form for now. It's only static pages. It will have a blog and may be a contact page with a form in the futur.
It's why I was looking to have an cache control as public for main of the pages. I looked https://www.fastly.com/blog/caching-uncacheable-csrf-security, but I plan to use nginx to cache pages. So I can't use ESI. I could use cookie or an endpoint.
But may be in my case, I could just no care about meta tags and cache them anyway. Until I don't use cache control public
in page with form.
Posted in Caching static pages without CSRF token
Hi,
I'm looking to use expires_in
method in my actions who returns static content.
For this pages I would like to return a cache control header where public
is true
. Like this it allow an proxy cache to store the content.
My question is more about CSRF token meta tags. I'm looking to have the CSRF meta tags not printed out when I use cache control has public. I was first looking to play with protect_from_forgery
options but still print the tags.
I finally saw into Rails code that csrf_meta_tags
are only printed if protect_against_forgery?
returns true
. And that is linked to self.allow_forgery_protection
.
So I do this code that works for me.
class ApplicationController < ActionController::Base
...
def expires_in(seconds, options = {})
super
self.allow_forgery_protection = false if options.fetch(:public, false)
end
end
But may be there is a better way to do it or may be I miss some Rails tools.
What do you think about?