An open API service indexing awesome lists of open source software.

https://github.com/Hexlet/active_form_model


https://github.com/Hexlet/active_form_model

hacktoberfest

Last synced: 11 months ago
JSON representation

Awesome Lists containing this project

README

          

# ActiveFormModel

[![github action status](https://github.com/Hexlet/active_form_model/workflows/main/badge.svg)](https://actions-badge.atrox.dev/hexlet/hexlet-cv/goto)

Painless forms for ActiveRecord. Based on Inheritance. Included:

* Strong parameters
* Validation (based on the model validation)
* Data normalization

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'active_form_model'
```

And then execute:

$ bundle install

Or install it yourself as:

$ gem install active_form_model

## Usage

1. Create directory *app/forms*
1. Add Form class for a model
1. Add permitted params inside the class
1. Use it as a normal model (without strong_params)

## Generator

Use the supplied generator to generate forms:

$ rails g active_form_model:form sign_up --model=user

or with namespace model

$ rails g active_form_model:form admin_post --model=blog/post

### Example

```ruby
# app/forms/user_sign_up_form.rb
class UserSignUpForm < User
include ActiveFormModel

# list all the permitted params
permit :first_name, :email, :password

# add validation if necessary
# they will be merged with base class' validation
validates :password, presence: true

# optional data normalization
def email=(email)
if email.present?
write_attribute(:email, email.downcase)
else
super
end
end
end
```

In some cases it is necessary to use ActiveRecord object directly without form. For such cases conveniently to use method `becomes()` (built-in ActiveRecord):

```ruby
user = User.find(params[:id])
form = user.becomes(UserSignUpForm)
```

If you want to build virtual form that is not tied to any class:

```ruby
# frozen_string_literal: true

class SignInForm
include ActiveFormModel::Virtual

fields :email, :password

validates :email, presence: true
validates :password, presence: true
validate :user_exists, :user_can_sign_in

def user_can_sign_in
errors.add(:password, :cannot_sign_in) if password.present? && !user&.valid_password?(password)
end

def user_exists
errors.add(:email, :user_does_not_exist_html) if email.present? && !user
end

def user
@user ||= User.find_by(email: email)
end

def email=(value)
@email = value.downcase
end
end
```

## Development

After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/active_form_model. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/active_form_model/blob/master/CODE_OF_CONDUCT.md).

## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).

## Code of Conduct

Everyone interacting in the ActiveFormModel project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/active_form_model/blob/master/CODE_OF_CONDUCT.md).