https://github.com/jun0kada/context_eval
https://github.com/jun0kada/context_eval
rails ruby
Last synced: 2 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/jun0kada/context_eval
- Owner: Jun0kada
- License: mit
- Created: 2019-03-11T09:20:33.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2019-03-12T03:00:21.000Z (over 7 years ago)
- Last Synced: 2025-03-04T10:48:17.225Z (over 1 year ago)
- Topics: rails, ruby
- Language: Ruby
- Size: 7.81 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# ContextEval
[](https://travis-ci.org/Jun0kada/context_eval)
provide `Object#context_eval`
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'context_eval'
```
And then execute:
$ bundle
Or install it yourself as:
$ gem install context_eval
## Usage
```ruby
class Notification < ActiveRecord::Base
belongs_to :user
belongs_to :notifiable, polymorphic: true
delegate :notification_config, to: :notifiable
def title
notifiable.context_eval(notification_config[:title]) || raise
end
def message
notifiable.context_eval(notification_config[:message])
end
end
module Notifiable
extend ActiveSupport::Concern
included do
config_accessor :notification_config, instance_writer: false # ActiveSupport::Configurable
has_one :notification, as: :notifiable, dependent: :destroy, class_name: '::Notification'
after_create do
self.create_notification!(user: context_eval(notification_config[:send_to]))
end
end
end
class Nice < ActiveRecord::Base
include Notifiable
self.notification_config = {
title: 'Nice!',
send_to: -> { article.user }
}
belongs_to :article
end
class Comment < ActiveRecord::Base
include Notifiable
self.notification_config = {
title: -> { "#{body[0..20]}..." },
message: :body,
send_to: -> { article.user }
}
belongs_to :article
end
```
```sample.html.erb
-
<%= notification.title %>
<% if notification.message.present? %>
<%= notification.message %>
<% end %>
<% @notifications.each do |notification| %>
<% end %>
```
### Detail
```ruby
class User
attr_accessor :name
def initialize(name)
@name = name
end
end
user = User.new('john')
# Symbol
user.context_eval(:name) #=> john
# Proc
proc_arg = Proc.new { "Mr. #{name}" }
user.context_eval(proc_arg) #=> Mr. john
# Proc and args
proc_arg = Proc.new { |age| "Mr. #{name}, #{age} years old." }
user.context_eval(proc_arg, 30) #=> Mr. john, 30 years old.
# Lambda
lambda_arg = -> { "Mr. #{name}" }
user.context_eval(lambda_arg) #=> Mr. john
# Lambda and args
lambda_arg = -> (age) { "Mr. #{name}, #{age} years old." }
user.context_eval(lambda_arg, 30) #=> Mr. john, 30 years old.
# String
user.context_eval('Hey john') #=> Hey John
# Nil
user.context_eval(nil) #=> nil
```
##
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/context_eval. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
## 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 ContextEval project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/context_eval/blob/master/CODE_OF_CONDUCT.md).