Skip to content

TILs

Fueling Curiosity, One Insight at a Time

At Codemancers, we believe every day is an opportunity to grow. This section is where our team shares bite-sized discoveries, technical breakthroughs and fascinating nuggets of wisdom we've stumbled upon in our work.

  1. GiritharanSystem Analyst
    Delegating Permissions in Pundit:

    I encountered a scenario where I needed to retrieve the scope of one policy and use it within another policy. Specifically, I wanted to delegate permissions from one policy to another.

    To address this issue, I learned to use Pundit's methods for manually retrieving policies and scopes:
    • Retrieving a Policy

    Ruby

    Pundit.policy(user, record)  # Returns nil if the policy does not exist
    Pundit.policy!(user, record) # Raises an exception if the policy does not exist


    • Retrieving a Policy Scope:

    Ruby

    Pundit.policy_scope(user, ModelClass)  # Returns nil if the policy scope does not exist
    Pundit.policy_scope!(user, ModelClass) # Raises an exception if the policy scope does not exist


    These methods allowed me to delegate permissions effectively by retrieving and applying the appropriate scopes and policies

    #rails #pundit #pundit-policy #authorization
  2. Quick Tip: How can we open a PR from one repository to another repository

    1. Create the branch in the current repo

    Code

    git checkout -b new-branch


    2. Add the destination repository as a remote.

    Code

    git remote add destination https://github.com/username/destination-repo.git


    3. Push the new branch to the destination repository

    Code

    git push destination new-branch


    4. To check all the remote repositories added, we can do:

    Code

    git remote -v


    Then, we create a PR in the destination repository from the new branch. This process effectively copies the changes from the original PR into a new PR in a different repository.

    #github #git
  3. Rails templates accept any locals as arguments. However, starting from Rails 7.1, we can restrict which locals a template must accept using "Strict Locals".


    Code

    // _search.html.erb
    
    <# locals: (:url, :field_name, :placeholder) -%>


    We can also set default values

    Code

    <# locals: (placeholder: "Search", :url, :field_name) -%>


    #rails
  4. Adithya HebbarSystem Analyst
    Detecting a mobile browser using regex.

    You can use regex which returns a true or false value depending on whether or not the user is browsing with a mobile. WOW!

    JavaScript

    window.mobilecheck = function () {
      var mobileCheck = false;
      (function (a) {
        if (
          /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(
            a
          ) ||
          /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(
            a.substr(0, 4)
          )
        )
          mobileCheck = true;
      })(navigator.userAgent || navigator.vendor || window.opera);
      return mobileCheck;
    };


    I wonder who in the world wrote this snippet!!! :)

    #javascript #browser
  5. Ransack adds several class methods to ActiveRecord::Base for managing search and sort capabilities. These methods allow us to define which attributes, associations, and scopes are accessible through Ransack queries, thus enhancing security and control.

    ransackable_attributes: Defines which model attributes can be used in Ransack searches.
    For example, only the order_number, status, and business_unit fields can be used in Ransack searches.

    Code

    def self.ransackable_attributes(auth_object = nil)
        %w[order_number status business_unit]
      end


    ransackable_associations: Specifies which model associations are accessible for searching.
    For examle, only the customer and vendor associations are allowed for searching.

    Code

    def self.ransackable_associations(auth_object = nil)
        %w[customer vendor]
      end


    ransortable_attributes: Lists which attributes can be used for sorting results.
    In this example, sorting is allowed only by order_number and created_at

    Code

    def self.ransortable_attributes(auth_object = nil)
        %w[order_number created_at]
      end


    ransackable_scopes: Determines which custom scopes can be applied in searches.

    #rails #ransack #search
  6. In postgres, current_setting() function is used to get the value of a configuration parameter.

    Code

    Set rls.tenant_id = 1;
    SET
    
    select current_setting('rls.tenant_id');
     current_setting
    -----------------
     1
    (1 row)


    #postgres
  7. Namespaces in Rails help organize our application by grouping related controllers, models, and views into separate directories. Using namespaces with scaffolding keeps our codebase structured and manageable, especially in larger applications.

    Example.
    rails generate scaffold Order::PurchaseOrder order_number:string business_unit:string ...

    This will create files under the Order namespace, including controllers, models, and views. This approach keeps our codebase structured, with Order as a namespace, making it easier to manage related components and maintain clarity in larger applications.


    Ruby

    app/
    ├── controllers/
    │   └── order/
    │       └── purchase_orders_controller.rb
    ├── models/
    │   └── order/
    │       └── purchase_order.rb
    ├── views/
    │   └── order/
    │       └── purchase_orders/
    │           ├── _form.html.erb
    │           ├── edit.html.erb
    │           ├── index.html.erb
    │           ├── new.html.erb
    │


    #rails #namespace
  8. Vaibhav YadavSenior System Analyst
    Cross browser regular expression issue:

    Recently I came across a regular expression that would cause the page to crash on iphone Safari browser, the regex was for obscuring email.

    Problematic Regex:

    JavaScript

    const obscuredEmail = email.replace(/(?<=.1}).(?=[^@]*@)/g, '*');


    Fix:

    JavaScript

    const obscuredEmail = email.replace(/(.)(?=.*@)/g, (match, p1, offset, string) => offset < string.indexOf('@') - 1 ? '*' : p1);


    Lesson: Even a browser can cause browser compatibility issues.

    #regex #browserCompatibility #safari #javascript
  9. Sachin KabadiSystem Analyst
    How to override models in parent application by reopening existing Rails engine classes. This can be done by organising overrides in a dedicated directory (e.g., app/overrides), ignoring this directory in the autoloader, and preloading the overrides in a to_prepare callback.

    Ruby

    # config/application.rb
    module MyApp
      class Application < Rails::Application
        # ...
    
        overrides = "#{Rails.root}/app/overrides"
        Rails.autoloaders.main.ignore(overrides)
    
        config.to_prepare do
          Dir.glob("#{overrides}/**/*_override.rb").sort.each do |override|
            load override
          end
        end
      end
    end


    To override an engine model, such as Blog::Article:

    Ruby

    # Blog/app/models/blog/article.rb
    module Blog
      class Article < ApplicationRecord
        # ...
      end
    end


    Create a file that reopens the class:

    Ruby

    # MyApp/app/overrides/models/blog/article_override.rb
    Blog::Article.class_eval do
      # ...
    end


    Using class_eval ensures we are reopening the class or module, not redefining it.

    #rails #rails-engines
  10. Remove the published gem from rubygems using

    Ruby

    gem yank GEM -v VERSION


    #rails #rubygems
  11. while using form.file_field for file attachments we can restrict the file type to any type if we want.
    For eg: if we want to accept file of type image then we can pass accept attribute.

    Code

    <%= form.file_field :picture, accept: "image/*" %>


    Note: This will disable other file types in your local file dialog while enabling the image files only 🪄 .
    #rails , #active-storage
  12. To ensure a dependency is installed with the engine during gem install, it must be specified within the Gem::Specification block inside the engine's .gemspec file (e.g., blog.gemspec for an engine named Blog, located at the root)

    Code

    s.add_dependency "pagy"


    #rails #rails-engines
  13. In Rails, gems are libraries that add specific functionality to a Rails application. They can be used across different projects and typically do not have their own structure or generators.
    Examples include devise for authentication and nokogiri for XML parsing.

    Engines, on the other hand, are miniature Rails applications that can have their own routes, controllers, models, and views. They are used to encapsulate and modularize specific features or components within a Rails app. An engine can be packaged as a gem, but it provides more extensive, self-contained functionality compared to a typical gem.

    #rails
  14. A Rails engine is a pattern used to modularize a Rails application. These engines are self-contained applications with their own models, views, controllers, and routes, allowing them to function autonomously. They can be integrated into a larger Rails application. For example, in an e-commerce application, modules like orders, products, users, and payments can each be separate engines.
    #rails
  15. Codemancers
    Resolving gen_random_uuid() Error with PostgreSQL While Implementing CI
    When configuring CI with GitHub Actions, I encountered the following error:

    Code

    PG::UndefinedFunction: ERROR:  function gen_random_uuid() does not exist


    This error occurred because the gen_random_uuid() function is not available in PostgreSQL versions older than 11. UUID generation functions were only available through external modules like uuid-ossp and pgcrypto in these older versions.

    To resolve this issue, I upgraded to PostgreSQL 13, which includes the gen_random_uuid() function to generate version-4 UUIDs. After upgrading, the error was resolved.



    #rails #postgresql #uuid #ci-cd #github-actions
  16. Adithya HebbarSystem Analyst
    Jupyter Labs

    • To install Jupyter Labs in Mac using Homebrew:

    Python

    brew install jupyterlab


    • To run Jupyter lab:

    Python

    jupyter lab


    This will open JupyterLab in your default web browser.

    #python #homebrew
  17. GiritharanSystem Analyst
    The fields_for helper in Rails creates form bindings without rendering a <form> tag. This is particularly useful for rendering fields for additional model objects within a single form.

    Imagine you have a Book model with an associated Author model. You can create a single form for both the Book and Author models using the fields_for helper.


    Ruby

    <%= form_with model: @book do |book_form| %>
      <%= book_form.text_field :title %>
      <%= book_form.text_area :description %>
    
      <%= fields_for :author, @book.author do |author_form| %>
        <%= author_form.text_field :name %>
        <%= author_form.text_field :email %>
      <% end %>
    <% end %>


    #rails #fields-for #rails-view
  18. Codemancers
    rails db:prepare in Ruby on Rails, This command sets up and prepares the database for my application, ensuring everything's ready to go, including populating the database.
    #rails #databasesetup
  19. Soniya Rayabagi
    Handling Terraform State Errors with S3 Backend:
    We use an S3 bucket to store our Terraform state. If Terraform fails to update the state, it creates an errored.tfstate file in your working directory. Reapplying will cause errors because the resources already exist.
    To fix this, push the errored state back to S3:
    terraform state push errored.tfstate

    #devops #terraformstateS3 #errorhandling
  20. In Ruby, exception handling is done using begin, rescue, ensure, and end blocks. Here's a brief overview of how they work in a general Ruby context:


    Ruby

    begin
      # Code that might raise an exception
    rescue SomeExceptionClass => e
      # Code that handles the exception
    ensure
      # Code that will always run, regardless of whether an exception was raised
    end


    begin: Marks the beginning of a block of code that might raise exceptions.

    rescue: Specifies what to do if a specific exception is raised. We can rescue multiple exception types by chaining rescue blocks.

    ensure: An optional block that will always execute, regardless of whether an exception was raised or rescued. It's useful for cleanup code that must run no matter what.

    #ruby #rails

Showing page 10 of 42

Your competitors are already using AI. The question is how fast you want to unlock the value.

  • Don't know where to start?

    AI is everywhere but it's unclear which investments will actually move your metrics and which are expensive experiments.

  • Your data isn't ready

    Most AI projects fail at the data layer. Pipelines, quality, access all need work before LLMs can deliver value.

  • Internal teams are stretched

    Your engineers are shipping product. They don't have capacity to also become AI specialists with production-grade experience.

  • Legacy systems block everything

    Aging, undocumented codebases make AI integration slow, risky, and expensive. They need to move first.

Don't worry. We've got you covered.

Start with the audit.

Book a free discovery call