---
name: blueprint-gem
description: Work with Blueprinter gem for JSON serialization in Ruby. Covers fields, views, associations, transformers, extractors, and configuration. Use when creating, modifying, or debugging blueprints.
---
Blueprints are JSON object presenters - they transform Ruby objects into simple hashes for JSON serialization. They are NOT models, NOT decorators. Keep them focused on presentation logic only.
Use views to provide different serialization contexts for the same blueprint. Don't create separate blueprint classes when views suffice. Views can include other views and exclude fields.
Use `fields` (plural) for multiple simple attributes. Use `field` (singular) only when you need a block, renaming, or options. This keeps blueprints concise.
```ruby
# Good - concise
fields :id, :name, :email, :created_at
# Only use singular when needed
field :full_name do |user|
"#{user.first_name} #{user.last_name}"
end
```
`identifier` fields always render in every view (they have their own implicit `:identifier` view). Use for primary keys and unique identifiers only.
```ruby
class UserBlueprint < Blueprinter::Base
identifier :id
fields :email, :name, :created_at
end
# Usage
UserBlueprint.render(user) # JSON string
UserBlueprint.render_as_hash(user) # Ruby Hash
```
```ruby
field :full_name do |user|
"#{user.first_name} #{user.last_name}"
end
# With options access
field :display_name do |user, options|
options[:admin] ? user.admin_name : user.public_name
end
```
```ruby
association :company, blueprint: CompanyBlueprint
association :posts, blueprint: PostBlueprint, view: :summary
```
```ruby
view :extended do
fields :phone, :address
association :orders, blueprint: OrderBlueprint
end
# Usage
UserBlueprint.render(user, view: :extended)
```
```ruby
field :salary, if: ->(field_name, user, options) { options[:show_salary] }
field :age, unless: ->(field_name, user, options) { user.hide_age? }
```
What do you need help with?
1. Create a new blueprint
2. Understand a specific concept (views, associations, transformers, etc.)
3. Debug a blueprint issue
4. Something else
**For option 2, specify the concept and I'll load the relevant reference.**
| Response | Action |
|----------|--------|
| 1, "create", "new" | Read `workflows/create-blueprint.md` |
| 2, "fields", "identifier" | Read `references/fields-and-identifiers.md` |
| 2, "views", "view" | Read `references/views.md` |
| 2, "association", "nested" | Read `references/associations.md` |
| 2, "config", "configure", "setup" | Read `references/configuration.md` |
| 2, "transformer", "extractor" | Read `references/transformers-and-extractors.md` |
| 2, "conditional", "default", "if", "unless" | Read `references/conditionals-and-defaults.md` |
| 3, "debug", "issue", "problem" | Read `references/anti-patterns.md` first |
| 4, other | Clarify need, then select appropriate reference |
**After reading, apply the knowledge to the user's specific situation.**
**Core Concepts:**
- fields-and-identifiers.md - Fields, identifiers, computed fields, field options
- views.md - Views, include/exclude, view inheritance
- associations.md - Nested blueprints, polymorphic associations
**Advanced:**
- configuration.md - Global config, JSON generators, field sorting
- transformers-and-extractors.md - Custom transformers and extractors
- conditionals-and-defaults.md - Conditional fields, defaults, nil handling
**Troubleshooting:**
- anti-patterns.md - Common mistakes and how to fix them
| Workflow | Purpose |
|----------|---------|
| create-blueprint.md | Create a new blueprint with proper structure |