mcpField
A
avo-coder

avo-coder

github.com/majesticlabs-dev开发5063 次安装7 周前更新
代码仓库

关于 avo-coder

avo-coder 是一项用于使用 Avo 构建 Rails 管理界面的技能,涵盖资源、字段、操作、筛选器、范围、仪表盘卡片和授权。创建组件前,它要求先获取最新的 Avo 文档。

主要功能

  1. 01生成 Avo 资源和操作
  2. 02配置字段及可见性
  3. 03添加筛选器和范围
  4. 04构建仪表盘指标卡片
  5. 05设置 Pundit 授权
  6. 06创建组件前获取最新 Avo 文档

适用场景

  1. 01为 Rails 应用创建管理界面
  2. 02定义资源字段并搜索记录
  3. 03添加自定义操作、筛选器和范围
  4. 04构建仪表盘指标与访问策略

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/majesticlabs-dev/majestic-marketplace --skill avo-coder

安装后在 Claude Code 中输入/avo-coder确认已加载。

详细介绍

Avo 编码

使用 Avo 为 Rails 构建管理界面。创建资源前,务必先获取最新文档。

首先:获取最新文档

创建任何 Avo 组件前,先获取当前文档:

WebFetch: https://docs.avohq.io/3.0/llms-full.txt

这样可以确保你使用的是最新的 Avo 3.x 模式和 API。

资源生成

bin/rails generate avo:resource User

基本资源结构

# app/avo/resources/user_resource.rb
class Avo::Resources::User < Avo::BaseResource
  self.title = :email
  self.includes = [:posts, :profile]
  self.search = {
    query: -> { query.ransack(email_cont: params[:q]).result }
  }

  def fields
    field :id, as: :id
    field :email, as: :text, required: true
    field :name, as: :text
    field :avatar, as: :file, is_image: true
    field :created_at, as: :date_time, readonly: true

    # Associations
    field :posts, as: :has_many
    field :profile, as: :has_one
  end
end

字段类型

def fields
  # Basic fields
  field :title, as: :text
  field :body, as: :trix          # Rich text
  field :bio, as: :textarea
  field :count, as: :number
  field :price, as: :currency
  field :published, as: :boolean
  field :status, as: :select, options: { draft: "Draft", published: "Published" }
  field :tags, as: :tags

  # Date/Time
  field :published_at, as: :date_time
  field :birth_date, as: :date

  # Files
  field :document, as: :file
  field :avatar, as: :file, is_image: true
  field :photos, as: :files

  # Associations
  field :author, as: :belongs_to
  field :comments, as: :has_many
  field :tags, as: :has_and_belongs_to_many

  # Computed
  field :full_name, as: :text do
    "#{record.first_name} #{record.last_name}"
  end
end

字段可见性

field :email, as: :text,
  show_on: :index,              # Show on index
  hide_on: :forms,              # Hide on new/edit
  readonly: true                 # Can't edit

# Conditional visibility
field :admin_notes, as: :textarea,
  visible: -> { current_user.admin? }

操作

bin/rails generate avo:action ArchiveUser
# app/avo/actions/archive_user.rb
class Avo::Actions::ArchiveUser < Avo::BaseAction
  self.name = "Archive User"
  self.message = "Are you sure you want to archive this user?"
  self.confirm_button_label = "Archive"
  self.cancel_button_label = "Cancel"

  def fields
    field :reason, as: :textarea, required: true
  end

  def handle(query:, fields:, current_user:, resource:, **args)
    query.each do |record|
      record.update!(archived: true, archive_reason: fields[:reason])
    end

    succeed "Archived #{query.count} users"
  end
end

在资源中注册:

def actions
  action Avo::Actions::ArchiveUser
end

筛选器

bin/rails generate avo:filter ActiveUsers
# app/avo/filters/active_users.rb
class Avo::Filters::ActiveUsers < Avo::Filters::BooleanFilter
  self.name = "Active Status"

  def options
    {
      active: "Active",
      inactive: "Inactive"
    }
  end

  def apply(request, query, values)
    return query if values.blank?

    if values["active"]
      query = query.where(active: true)
    end

    if values["inactive"]
      query = query.where(active: false)
    end

    query
  end
end

在资源中注册:

def filters
  filter Avo::Filters::ActiveUsers
end

作用域

# In resource
def scopes
  scope Avo::Scopes::Active
  scope Avo::Scopes::Archived
end

# app/avo/scopes/active.rb
class Avo::Scopes::Active < Avo::Advanced::Scopes::BaseScope
  self.name = "Active"
  self.description = "Active users only"
  self.scope = -> { query.where(active: true) }
end

卡片(仪表板)

# app/avo/cards/users_count.rb
class Avo::Cards::UsersCount < Avo::Cards::MetricCard
  self.id = "users_count"
  self.label = "Total Users"

  def query
    result User.count
  end
end

授权

Avo 与 Pundit 集成:

# app/policies/user_policy.rb
class UserPolicy < ApplicationPolicy
  def index?
    user.admin?
  end

  def show?
    user.admin? || record == user
  end

  def create?
    user.admin?
  end

  def update?
    user.admin?
  end

  def destroy?
    user.admin? && record != user
  end
end

常见模式

侧边栏自定义:

# config/initializers/avo.rb
Avo.configure do |config|
  config.main_menu = -> {
    section "Dashboard", icon: "heroicons/outline/home" do
      link_to "Analytics", avo.analytics_path
    end

    section "Content", icon: "heroicons/outline/document-text" do
      resource :post
      resource :category
    end

    section "Users", icon: "heroicons/outline/users" do
      resource :user
      resource :role
    end
  }
end

输出格式

构建 Avo 组件后:

  1. 创建的文件 - 资源、操作、筛选器
  2. 注册 - 组件的注册位置
  3. 权限 - 所需的策略方法
  4. 用法 - 如何在管理界面中访问

评论

支持 Markdown