开源项目 assignable_values
使用教程
项目介绍
assignable_values
是一个用于限制 ActiveRecord 模型属性和关联可赋值的 gem。它允许你在运行时生成允许的值列表,并在验证过程中检查这些值。这个 gem 特别适用于需要动态生成枚举值、国际化应用和常见授权模式的场景。
项目快速启动
安装
首先,将 assignable_values
添加到你的 Gemfile 中:
gem 'assignable_values'
然后运行 bundle install
。
基本用法
假设你有一个 Song
模型,并且你想限制 genre
属性的可赋值范围:
class Song < ActiveRecord::Base
assignable_values_for :genre do
['pop', 'rock', 'electronic']
end
end
验证
创建一个新的 Song
实例并验证其 genre
属性:
song = Song.new(genre: 'rock')
song.valid? # => true
song = Song.new(genre: 'elephant')
song.valid? # => false
应用案例和最佳实践
动态生成可赋值列表
你可以根据其他属性动态生成可赋值列表。例如,根据歌曲的年份生成 genre
列表:
class Song < ActiveRecord::Base
validates_numericality_of :year
assignable_values_for :genre do
genres = []
genres << 'jazz' if year > 1900
genres << 'rock' if year > 1960
genres
end
end
从其他源获取可赋值列表
你可以从其他对象获取可赋值列表,这在授权场景中非常有用:
class Story < ActiveRecord::Base
assignable_values_for :state, through: proc { Power.current }
end
class Power
cattr_accessor :current
def initialize(role)
@role = role
end
def assignable_story_states(story)
states = ['draft', 'pending']
states << 'accepted' if @role == :admin
states
end
end
典型生态项目
assignable_values
可以与以下项目结合使用,以增强其功能:
- Rails:作为 ActiveRecord 的扩展,与 Rails 框架完美集成。
- I18n:支持国际化,可以在 I18n 字典中定义人类可读的标签。
- CanCanCan 或 Pundit:用于权限管理,确保只有授权的用户可以设置特定的值。
通过这些集成,assignable_values
可以在多种复杂场景中提供强大的值限制和验证功能。