Uploaded November 2022 | Updated September 2026, 2 weeks ago
This is an exciting moment in the history of Stateless Code! One of our viewers has opened up a pull request to collaborate on the project with suggestions to improve the implementation of our Fix Devise Views to Work with Tailwind and Turbo video.
The proposed pull request moves the class aggregations we had placed into a Rails helper into Tailwind directives.
In the video, we compare and contrast the alternatives. Tailwind directives apply the styles to an HTML class at the CSS level. The Rails helper methods add the CSS classes to the HTML at an individual level. Ultimately we decide to keep the Rails helper version so that we have more control to toggle individual HTML classes via Stimulus. Once we have a more settled design, we might move at least some of our HTML classes that are always used together into directives, but for the time being we decide to stick with the existing implementation.
We do make two changes to improve our app as a result of the pull request though.
1. We ditch the .html_safe at the end of our join_classes() method. Since we aren't currently calling the method on anything provided by user input, the security risk is small. But it turns out that it's completely unnecessary, so we just get rid of it.
2. We missed styling the button on the unlocks/new view. We add it in.
This video covers:
00:00:12 Introduction.
00:02:41 Take a look at the pull request and preliminary review to ensure it's safe to pull down locally
00:06:36 Explanation of Tailwind directives
00:07:44 Resume review of diff in pull request
00:09:49 Add the pull request forked repo as a remote and an explanation of local branches, remote tracking branches and remote branches
00:12:48 Check out the pull request branch (detatched head state) and launch the dev server
00:14:10 Click around in the browser and check things out. The HTML class is the directive class (like tw_alert_button)
00:14:55 Demonstration of the difference in HTML classes in the DOM in the pull request version using directives and the Rails helper methods
00:17:37 Discussion of the trade-offs and considerations of using Rails helpers vs Tailwind directives
00:21:43 Add missing button styling to unlocks/new
00:24:07 Remove the unnecessary and dangerous .html_safe from the join_classes method
00:26:13 Make sure you don't programatically generate Tailwind classes in your Rails helpers via interpolation or concatenation
00:30:43 Review diff, run tests and RuboCop
00:32:00 Provide comment on pull request
00:35:32 Commit and push our changes that address feedback
00:36:51 Close pull request
#ruby #rails7 #rails #rubyonrails #rubygems #codecast #screencast #github #opensource #minitest #TDD #agile #NerdDice #DnD #roleplaying #softwaredevelopment #learntocode #tailwind #postgresql #rubocop #devise #turbo #controllers #views #selenium #capybara #systemtest #pullrequest #collaboration #directives #helpers #codealong
See other related StatelessCode videos:
- Fix Devise Views to Work with Tailwind and Turbo
youtu.be/8VjIML0Sdks
- Create a RubyGem 87: Downtime Hodgepodge and a Contributor youtu.be/qTP_vq7DLBU
Resources that we relied upon for this solution:
- secretpray (our contributor) on GitHub: github.com/secretpray
This video is CC0 - No rights reserved. (YouTube doesn't allow this option when publishing.) All code is released under the UNLICENSE. Stateless Code denies the concept of "intellectual property". Copying is not stealing.
This is an exciting moment in the history of Stateless Code! One of our viewers has opened up a pull request to collaborate on the project with suggestions to improve the implementation of our Fix Devise Views to Work with Tailwind and Turbo video.
The proposed pull request moves the class aggregations we had placed into a Rails helper into Tailwind directives.
In the video, we compare and contrast the alternatives. Tailwind directives apply the styles to an HTML class at the CSS level. The Rails helper methods add the CSS classes to the HTML at an individual level. Ultimately we decide to keep the Rails helper version so that we have more control to toggle individual HTML classes via Stimulus. Once we have a more settled design, we might move at least some of our HTML classes that are always used together into directives, but for the time being we decide to stick with the existing implementation.
We do make two changes to improve our app as a result of the pull request though.
1. We ditch the .html_safe at the end of our join_classes() method. Since we aren't currently calling the method on anything provided by user input, the security risk is small. But it turns out that it's completely unnecessary, so we just get rid of it.
2. We missed styling the button on the unlocks/new view. We add it in.
This video covers:
00:00:12 Introduction.
00:02:41 Take a look at the pull request and preliminary review to ensure it's safe to pull down locally
00:06:36 Explanation of Tailwind directives
00:07:44 Resume review of diff in pull request
00:09:49 Add the pull request forked repo as a remote and an explanation of local branches, remote tracking branches and remote branches
00:12:48 Check out the pull request branch (detatched head state) and launch the dev server
00:14:10 Click around in the browser and check things out. The HTML class is the directive class (like tw_alert_button)
00:14:55 Demonstration of the difference in HTML classes in the DOM in the pull request version using directives and the Rails helper methods
00:17:37 Discussion of the trade-offs and considerations of using Rails helpers vs Tailwind directives
00:21:43 Add missing button styling to unlocks/new
00:24:07 Remove the unnecessary and dangerous .html_safe from the join_classes method
00:26:13 Make sure you don't programatically generate Tailwind classes in your Rails helpers via interpolation or concatenation
00:30:43 Review diff, run tests and RuboCop
00:32:00 Provide comment on pull request
00:35:32 Commit and push our changes that address feedback
00:36:51 Close pull request
#ruby #rails7 #rails #rubyonrails #rubygems #codecast #screencast #github #opensource #minitest #TDD #agile #NerdDice #DnD #roleplaying #softwaredevelopment #learntocode #tailwind #postgresql #rubocop #devise #turbo #controllers #views #selenium #capybara #systemtest #pullrequest #collaboration #directives #helpers #codealong
See other related StatelessCode videos:
- Fix Devise Views to Work with Tailwind and Turbo
youtu.be/8VjIML0Sdks
- Create a RubyGem 87: Downtime Hodgepodge and a Contributor youtu.be/qTP_vq7DLBU
Resources that we relied upon for this solution:
- secretpray (our contributor) on GitHub: github.com/secretpray
This video is CC0 - No rights reserved. (YouTube doesn't allow this option when publishing.) All code is released under the UNLICENSE. Stateless Code denies the concept of "intellectual property". Copying is not stealing.





![Set up a Salesforce Development Environment on Ubuntu 24.04
In this video, we guide you through setting up a Salesforce development environment on a new install of Ubuntu 24.04. The only things we have installed so far are Visual Studio Code, bzip2 and tar. We have other recent videos linked where we install Node.js (via NVM), VS Code, and Git, so we breeze through those steps quickly in this video.We start by installing Node. Then we install the Java 17 OpenJDK (and save the directory from the installation output so we can set it in the VS Code settings later.) After that we install Git.For the Salesforce CLI, I always use the install via NPM option, irrespective of which operating system I use. I find it to be easier to maintain and upgrade. After the CLI is installed, we install the Salesforce Extension Pack (including the expanded version). After the extension pack is installed we can set the Salesforcedx-vscode-apex Java: Home value in VS Code settings.We authorize our DevHub (a TrailHead developer edition) and create a scratch org and make it our default org with `sf config set`.When we try the `sf org open` command, it fails. Salesforce CLI assumes that the temporary directory being used is the system temporary directory. Ubuntu 24.04 has Firefox installed using snap. Snap sandboxing places the temp directory in the users home directory instead. There are two ways to resolve this. You can execute `TMPDIR=$HOME/temp sf org open [your-flags]` every time you run the sf org open command. This is tedious. The other option is that you can install a browser via apt instead of snap. Unfortunately Chromium will not work for this because the apt install uses snap. To resolve it, we install Chrome and make it the default browser. Theres a privacy trade-off here. Make the decision thats best for you.After we have the ability to open our scratch org, we create a Hello World! Taxation is theft! Lightning Web Component with a simple Jest test. We run npm install on the SFDX project directory so that we can run our JavaScript tests and everything.Finally we deploy the component to our scratch org, create a Lightning page with a few different instances of it, and retrieve everything back to our project.This video covers: 00:00:00 Introduction 00:01:38 Install Node 20 (requires curl and NVM) 00:03:19 Install Java 17 OpenJDK and copy the Java Home directory from the output 00:05:21 Install Git and Salesforce CLI NPM package 00:07:57 Install Salesforce Extension Pack (including Expanded) and configure Salesforce Java Home setting in VS Code 00:11:47 Use Salesforce CLI to login to DevHub 00:14:12 Create a scratch org 00:18:20 Workaround issue to get `sf org open` to work, option 1 adding TMPDIR variable to beginning of command 00:21:45 Alternative workaround, install Chrome via apt and set as default browser 00:29:13 Create a Hello World! Taxation is theft! Lightning Web Component and ensure Jest test framework works 00:36:35 Deploy the component to the scratch org, add to a Lightning Page, and retrieve the whole project back 00:40:37 Conclusion and preview of other upcoming Salesforce material #setup #configuration #install #linux #ubuntu #debian #deb #terminal #ubuntu24 #lts #github #code #visualstudiocode #vscode #apt #git #node #nodejs #nvm #npm #java #jdk #openjdk #salesforce #sfdx #salesforcecli #workaround #scratchorg #helloworldtaxationistheft #jest #lightningwebcomponent #lwcSee other related StatelessCode videos:- Install Ubuntu 24.04 LTS Desktop https://youtu.be/yHxuNUovS20- Install Node.js (versions 18, 20, 22) with NVM on Ubuntu 24.04 https://youtu.be/YyEf1QWfg9Y- Install Visual Studio Code on Ubuntu 24.04 https://youtu.be/GdmHY1JhLI8- Install Git on Ubuntu 24.04 and Configure for Verified Commits in GitHub https://youtu.be/CagiEjuqKxU- Migrate from SFDX CLI version 7.x to Salesforce CLI version 2.x https://youtu.be/kyii2tPwcBI- Codecast: Install Salesforce DX on Ubuntu 20.04 (from 2021) https://youtu.be/JaVf4FYcYw0Resources that we relied upon for this solution:- Lightning Web Components Developer Guide: Develop with Salesforce DX Tools https://developer.salesforce.com/docs/platform/lwc/guide/get-started-sfdx.html- Salesforce CLI Setup Guide https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli.htm- Node.js package manager instructions (you can choose your OS and preferred method) https://nodejs.org/en/download/package-manager - Salesforce CLI Command Reference https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_unified.htm- sf org open GitHub issue on forcedotcom/cli repo https://github.com/forcedotcom/cli/issues/2769- Command line workaround by setting TMPDIR variable https://github.com/salesforcecli/plugin-org/pull/992#issuecomment-2013234183
This video is CC0 - No rights reserved. All code is released under the UNLICENSE. Set up a Salesforce Development Environment on Ubuntu 24.04](https://i.ytimg.com/vi/OC4R71bQO4g/mqdefault.jpg)




