Bard::TagField
A Rails form helper gem that adds bard_tag_field to your forms, creating interactive tag input fields using the @botandrose/input-tag custom element.
Perfect for adding tag functionality to your Rails forms with a clean, modern interface that works seamlessly with your existing Rails form helpers.
Features
- ๐ท๏ธ Interactive tag input - Users can add/remove tags dynamically
- ๐ง Rails integration - Works like any other Rails form helper (
form.select,form.text_field, etc.) - ๐จ Customizable - Supports all standard HTML options (class, id, data attributes)
- ๐ก๏ธ Secure - Automatic HTML escaping prevents XSS attacks
- ๐งช Well-tested - Comprehensive test suite
- โก Modern - Built with custom web elements
- ๐ Compatible - Supports Ruby 3.2+ and Rails 7.1+
Usage
Basic Usage
After installing and requiring the gem, Use bard_tag_field in your Rails forms just like any other form helper:
<%= form_with model: @post do |form| %>
<%= form.bard_tag_field :tags %>
<% end %>This generates an interactive tag field that binds to your model's tags attribute.
With HTML Options
Add CSS classes, data attributes, and other HTML options:
<%= form.bard_tag_field :tags,
class: "form-control",
id: "post-tags",
data: { placeholder: "Add tags..." } %>With Existing Tags
The field automatically displays existing tags from your model:
# In your controller
@post.tags = ["rails", "ruby", "web-development"]<!-- Tags will be pre-populated in the form -->
<%= form.bard_tag_field :tags %>With Predefined Choices (Rails select-style)
Like form.select, you can provide predefined choices for users to select from:
<%= form.bard_tag_field :tags, ["ruby", "rails", "javascript", "css"] %>Or use nested arrays for display vs submit values:
<%= form.bard_tag_field :categories, [
["Web Development", "web-dev"],
["Machine Learning", "ml"],
["Database Design", "db"]
] %>This creates a datalist with available options while still showing current object values as selected tags.
Custom Content with Blocks
Use blocks for custom tag rendering:
<%= form.bard_tag_field :tags do |options| %>
<% @post.tags.each do |tag| %>
<tag-option value="<%= tag %>" class="custom-tag"><%= tag %></tag-option>
<% end %>
<% end %>Model Setup
Your model should handle tags as an array. Here are common approaches:
With Array Attribute (Rails 5+)
class Post < ApplicationRecord
# In migration: add_column :posts, :tags, :text, array: true, default: []
# Or use JSON column: add_column :posts, :tags, :json, default: []
endWith Serialization
class Post < ApplicationRecord
serialize :tags, Array
endWith ActsAsTaggable
class Post < ApplicationRecord
acts_as_taggable_on :tags
# Helper method for form binding
def tags_array
tag_list.to_a
end
def tags_array=(values)
self.tag_list = values
end
end<%= form.bard_tag_field :tags_array %>Generated HTML
The gem generates semantic HTML using custom elements:
<!-- With current object values -->
<input-tag name="post[tags]" id="post_tags">
<tag-option value="rails">rails</tag-option>
<tag-option value="ruby">ruby</tag-option>
</input-tag>
<!-- With choices parameter -->
<input-tag name="post[tags]" id="post_tags" list="post_tags_datalist">
<tag-option value="rails">rails</tag-option>
</input-tag>
<datalist id="post_tags_datalist">
<option value="ruby">ruby</option>
<option value="javascript">javascript</option>
<option value="css">css</option>
</datalist>JavaScript Integration
This gem works with the @botandrose/input-tag custom element. Make sure to include it in your asset pipeline:
// In your application.js or wherever you manage JS
import '@botandrose/input-tag'Or include the precompiled asset (automatically added by this gem):
//= require input-tagBrowser Support
- Modern browsers that support custom elements
- Graceful degradation for older browsers
- Supports Ruby 3.2+ and Rails 7.1+ (including Rails 8.0)
API Reference
bard_tag_field(method, choices = nil, options = {}, html_options = {}, &block)
Parameters:
-
method- The attribute name (symbol) -
choices- Optional array of predefined choices (likeform.select) -
options- Hash of Rails form options -
html_options- Hash of HTML attributes (class, id, data, etc.) -
&block- Optional block for custom content rendering
Returns: HTML-safe string containing the tag input element
Examples:
# Basic usage
form.bard_tag_field :tags
# With choices
form.bard_tag_field :tags, ["ruby", "rails", "javascript"]
# With nested choices (display vs value)
form.bard_tag_field :categories, [["Web Dev", "web"], ["ML", "ml"]]
# With HTML options
form.bard_tag_field :tags, class: "form-control", data: { max_tags: 5 }
# With choices and HTML options
form.bard_tag_field :tags, ["ruby", "rails"], {}, { class: "form-control" }Development
After checking out the repo, run bin/setup to install dependencies. Then, run bundle exec rspec to run the tests.
To install this gem onto your local machine, run bundle exec rake install.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/botandrose/bard-tag_field.
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request
License
The gem is available as open source under the terms of the MIT License.
Credits
Created by Micah Geisel at Bot & Rose.