ActionView::Template::Error (The asset "tailwind.css" is not present in the asset pipeline)

Hi all.

I’ve been experience an issue after launching/deploying a Rails app which is the title. I’ve already looked and tried the answers in the other topic of the same title but have still not been able to get past the “We’re sorry, but something went wrong” page with the same error over and over.

Here is my dockerfile:

# syntax = docker/dockerfile:1

# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
ARG RUBY_VERSION=3.3.0
FROM ruby:$RUBY_VERSION-slim as base

LABEL fly_launch_runtime="rails"

# Rails app lives here
WORKDIR /rails

# Set production environment
ENV BUNDLE_DEPLOYMENT="1" \
    BUNDLE_PATH="/usr/local/bundle" \
    BUNDLE_WITHOUT="development:test" \
    RAILS_ENV="production"

# Update gems and bundler
RUN gem update --system --no-document && \
    gem install -N bundler


# Throw-away build stage to reduce size of final image
FROM base as build

# Install packages needed to build gems and node modules
RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y build-essential curl libpq-dev node-gyp pkg-config python-is-python3

# Install JavaScript dependencies
ARG NODE_VERSION=18.15.0
ARG YARN_VERSION=1.22.19
ENV PATH=/usr/local/node/bin:$PATH
RUN curl -sL https://github.com/nodenv/node-build/archive/master.tar.gz | tar xz -C /tmp/ && \
    /tmp/node-build-master/bin/node-build "${NODE_VERSION}" /usr/local/node && \
    npm install -g yarn@$YARN_VERSION && \
    rm -rf /tmp/node-build-master

# Install application gems
COPY --link Gemfile Gemfile.lock ./
RUN bundle install && \
    bundle exec bootsnap precompile --gemfile && \
    rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git

# Install node modules
COPY --link .yarnrc package.json yarn.lock ./
COPY --link .yarn/releases/* .yarn/releases/
RUN yarn install --frozen-lockfile

# Copy application code
COPY --link . .

# Precompile bootsnap code for faster boot times
RUN bundle exec bootsnap precompile app/ lib/

# Precompiling assets for production without requiring secret RAILS_MASTER_KEY
RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile


# Final stage for app image
FROM base

# Install packages needed for deployment
RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y curl postgresql-client && \
    rm -rf /var/lib/apt/lists /var/cache/apt/archives

# Copy built artifacts: gems, application
COPY --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}"
COPY --from=build /rails /rails

# Run and own only the runtime files as a non-root user for security
RUN groupadd --system --gid 1000 rails && \
    useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \
    chown -R 1000:1000 db log storage tmp
USER 1000:1000

# Entrypoint sets up the container.
ENTRYPOINT ["/rails/bin/docker-entrypoint"]

# Start the server by default, this can be overwritten at runtime
EXPOSE 3000
CMD ["./bin/rails", "server"]

Here is my package.json:

{
  "name": "app",
  "private": true,
  "dependencies": {
    "@hotwired/stimulus": "^3.2.2",
    "@hotwired/turbo-rails": "^8.0.4",
    "@stimulus-components/notification": "^3.0.0",
    "esbuild": "^0.20.2",
    "toastify-js": "^1.12.0"
  },
  "scripts": {
    "build": "esbuild app/javascript/*.* --bundle --sourcemap --format=esm --outdir=app/assets/builds --public-path=/assets"
  },
  "devDependencies": {
    "daisyui": "^4.9.0",
    "postcss": "^8.4.38",
    "tailwindcss": "^3.4.3"
  },
  "packageManager": "yarn@1.22.19"
}

I’m at a complete loss on what to try next.

Why is tailwindcss a devDependency only? Try moving these three into the dependencies section, rerun yarn install, then fly deploy.

Moved those to dependencies and then re-deployed. Still getting the same error :confused:

Are you using the Rails tailwindcss-rails gem? What happens when you run rake assets:precompile locally?

I just tried the following, and it worked:

rails new demo --css tailwind --js esbuild
cd demo
bin/rails generate scaffold blog title:string body:text
fly launch --name demo-$USER-$RANDOM
fly apps open

And for good measure, I followed it up with:

bin/rails generate dockerfile --force
fly deploy
fly apps open

Here’s the package.json that is produced by the above:

{
  "name": "app",
  "private": true,
  "dependencies": {
    "@hotwired/stimulus": "^3.2.2",
    "@hotwired/turbo-rails": "^8.0.4",
    "autoprefixer": "^10.4.19",
    "esbuild": "^0.20.2",
    "postcss": "^8.4.38",
    "tailwindcss": "^3.4.3"
  },
  "scripts": {
    "build": "esbuild app/javascript/*.* --bundle --sourcemap --format=esm --outdir=app/assets/builds --public-path=/assets",
    "build:css": "tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css --minify"
  },
  "packageManager": "yarn@1.22.21"
}

I am using the Gem yes. The yarn install was only for a solution I found where they had a build:css script and ran that in the dockerfile.

When I run rake assets:precompile locally it works just fine and succeeds.

Initially with the project I was using importmaps but transitioned to esbuild, could that maybe be an issue?

It’s hard to say what the exact issue is, but it’s not unusual running into problems like this when transitioning from one pipeline to another (Rails makes this very difficult).

In theory, the tailwindcss-rails gem doesn’t need any external dependencies, but the fact that you’re including daisyui (and any Tailwind plugins) you’ll have to install the dependency on the build server and environment for it to compile.

esbuild shouldn’t be touching it, but it might be, and it could be causing problems in the pipeline depending on how it hooks into the precompile command.

On my projects where I only use tailwind I commit the ./node_modules directory to the repo so the build env picks it up and doesn’t need npm.

From the look of Sam’s package.json file, you probably need to change the devDependencies to dependencies and/or adjust your build script to pull in devDependencies.

Rails did make it hard to transition I can agree with that. I may end up just booting up a new project using --css tailwindcss --js esbuild and move my migrations/controllers/etc over to see if that may make things easier on me as well.

Good plan. If you are using a js runtime, you are supposed to use css-bundling-rails instead:

My gemfile doesn’t have the tailwindcss-rails gem in it.

That worked! Now I just have to go about making my images actually render

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.