Use own helpers in Resource files
rails app:template LOCATION='https://railsbytes.com/script/V2Gsb9'
A common pattern is to have some helpers defined in your app to manipulate your data. You might need those helpers in your
Let's say you have a
Post resource and you'd like to show a stripped-down version of your
body field. So in your
posts_helper.rb file you have the
extract_excerpt method that sanitizes the body and truncates it to 120 characters.
# app/helpers/posts_helper.rb module PostsHelper def extract_excerpt(body) ActionView::Base.full_sanitizer.sanitize(body).truncate 120 end end
Now, you'd like to use that helper inside one of you computed fields.
class PostResource < Avo::BaseResource field :excerpt, as: :text, hide_on: :all, as_description: true do |model| extract_excerpt model.body end end
Initially you'll get an error similar to
undefined method 'extract_excerpt' for #<Avo::Fields::TextField>. That's because the compute field executes that method in a scope that's different from your application controller, thus not having that method present.
The fix is to include the helper module in the
BaseField and we can do that using this snippet somewhere in the app (you can add it in
# config/initializers/avo.rb Avo.configure do |config| # Usual Avo config end module FieldExtensions # Include a specific helper include PostsHelper end Rails.configuration.to_prepare do Avo::Fields::BaseField.include FieldExtensions end
Or you can go wild and include all helpers programatically.
# config/initializers/avo.rb Avo.configure do |config| # Usual Avo config end module FieldExtensions # Include all helpers helper_names = ActionController::Base.all_helpers_from_path Rails.root.join("app", "helpers") helpers = ActionController::Base.modules_for_helpers helper_names helpers.each do |helper| send(:include, helper) end end Rails.configuration.to_prepare do Avo::Fields::BaseField.include FieldExtensions end
Now you can reference all helpers in your