Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ plugins:
AllCops:
NewCops: enable

Style/OneClassPerFile:
Exclude:
- spec/support/test_classes/**/*

Layout/LeadingCommentSpace:
Enabled: false

Expand Down
3 changes: 2 additions & 1 deletion .rubocop_rbs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ plugins:
# ========= RBS ===========
Style/RbsInline/MissingTypeAnnotation:
EnforcedStyle: method_type_signature

Exclude:
- 'spec/**/*'
Style/RbsInline/UntypedInstanceVariable:
Exclude:
- 'lib/structured_params/params.rb'
Expand Down
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,7 @@ end
- **[Strong Parameters](docs/strong-parameters.md)** - Automatic permit list generation
- **[Error Handling](docs/error-handling.md)** - Flat and structured error formats
- **[Serialization](docs/serialization.md)** - Converting parameters to hashes and JSON
- **[Gem Comparison](docs/comparison.md)** - Comparison with typed_params, dry-validation, and reform

- **[Form Objects](docs/form-objects.md)** - Form object pattern with Rails views

## Contributing

Expand Down
19 changes: 10 additions & 9 deletions README_ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,17 @@ def create
end
```

#### 型変換前の生入力をバリデーションする
#### プリミティブ配列

ActiveModel の型変換前の入力値を検証したい場合は `validates_raw` を使います
`value_type` を使うとプリミティブ型の配列を扱えます。Strong Parameters では配列フォーマット(`tags: []`)で許可されます

```ruby
class UserParams < StructuredParams::Params
attribute :age, :integer

validates_raw :age, format: { with: /\A\d+\z/, message: 'must be numeric string' }
attribute :tags, :array, value_type: :string
end

# 相当する Strong Parameters:
# params.permit(tags: [])
```

### 2. フォームオブジェクト
Expand Down Expand Up @@ -106,11 +107,11 @@ end

- **[インストールとセットアップ](docs/installation.md)** - StructuredParams の始め方
- **[基本的な使用方法](docs/basic-usage.md)** - パラメータクラス、ネストオブジェクト、配列
- **[バリデーション](docs/validation.md)** - ネスト構造でのActiveModelバリデーション使用
- **[Strong Parameters](docs/strong-parameters.md)** - 自動permit リスト生成
- **[バリデーション](docs/validation.md)** - ネスト構造での ActiveModel バリデーション使用
- **[Strong Parameters](docs/strong-parameters.md)** - 自動 permit リスト生成
- **[エラーハンドリング](docs/error-handling.md)** - フラットと構造化エラーフォーマット
- **[シリアライゼーション](docs/serialization.md)** - パラメータのハッシュとJSON変換
- **[Gem比較](docs/comparison.md)** - typed_params、dry-validation、reformとの比較
- **[シリアライゼーション](docs/serialization.md)** - パラメータのハッシュと JSON 変換
- **[フォームオブジェクト](docs/form-objects.md)** - Rails ビューとのフォームオブジェクトパターン


## コントリビューション
Expand Down
38 changes: 28 additions & 10 deletions docs/basic-usage.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# Basic Usage

Define a parameter class by inheriting from `StructuredParams::Params`. Declare typed attributes with `attribute` and use standard ActiveModel validations.

## Table of Contents

- [Basic Parameter Class](#basic-parameter-class)
- [Nested Objects](#nested-objects)
- [Arrays](#arrays)
- [Array of Primitive Types](#array-of-primitive-types)
- [Array of Nested Objects](#array-of-nested-objects)

## Basic Parameter Class

```ruby
Expand All @@ -25,6 +35,8 @@ end

## Nested Objects

Use `attribute :name, :object, value_class: SomeParams` to define a nested object.

```ruby
class AddressParams < StructuredParams::Params
attribute :street, :string
Expand All @@ -48,41 +60,47 @@ params = {
}

user_params = UserParams.new(params)
user_params.address # => AddressParams instance
user_params.address.city # => "New York"
user_params.address # => AddressParams instance
user_params.address.city # => "New York"
```

## Arrays

Use `attribute :name, :array, ...` to define an array attribute. Specify `value_type` for scalar elements or `value_class` for object elements.

### Array of Primitive Types

Use `value_type` for arrays of scalar values.

```ruby
class UserParams < StructuredParams::Params
attribute :tags, :array, value_type: :string
attribute :tags, :array, value_type: :string
attribute :scores, :array, value_type: :integer
end

# Usage
params = {
tags: ["ruby", "rails", "programming"],
tags: ["ruby", "rails", "programming"],
scores: [85, 92, 78]
}

user_params = UserParams.new(params)
user_params.tags # => ["ruby", "rails", "programming"]
user_params.tags # => ["ruby", "rails", "programming"]
user_params.scores # => [85, 92, 78]
```

### Array of Nested Objects

Use `value_class` for arrays of objects.

```ruby
class HobbyParams < StructuredParams::Params
attribute :name, :string
attribute :name, :string
attribute :level, :string
end

class UserParams < StructuredParams::Params
attribute :name, :string
attribute :name, :string
attribute :hobbies, :array, value_class: HobbyParams
end

Expand All @@ -91,11 +109,11 @@ params = {
name: "Alice",
hobbies: [
{ name: "Photography", level: "beginner" },
{ name: "Cooking", level: "intermediate" }
{ name: "Cooking", level: "intermediate" }
]
}

user_params = UserParams.new(params)
user_params.hobbies # => [HobbyParams, HobbyParams]
user_params.hobbies.first.name # => "Photography"
user_params.hobbies # => [HobbyParams, HobbyParams]
user_params.hobbies.first.name # => "Photography"
```
Loading