Skip to content

Auto-rendering ActionText body contents instead of their attributes hash #535

Open
@goulvench

Description

@goulvench

In ERB templates, ActionText attributes are automatically cast to strings, thus rendering their HTML contents. However, in jbuilder this is not the case and we have to call to_s on every action_text attribute, which is verbose and easy to forget.

What's worse is that it prevents passing an object and attributes list to json.extract! or an enumarable and a list of attributes to json.array!.

Is there a way to specify a formatter that would work on action_text fields only? Or perhaps adding an opt-in mechanism in Jbuilder::_extract_method_values to handle this situation?

I know this would mean tying adding ActionText-specific code to Jbuilder but given that these two libraries are generally used together in Rails, this could make sense. I'd be happy to take a stab at a PR if you think this is a good idea.

Example with json.extract!

# Doesn't work as expected:
json.extract! my_model, :id, :updated_at, :some_rich_text
{
  "id": 1,
  "updated_at":"2022-05-23T10:08:38.784+02:00",
  "some_rich_text":
  {
    "id":1,
    "name":"some_rich_text",
    "body":"<div>Rich text contents</div>",
    "record_type":"MyModel",
    "record_id":20,
    "created_at":"2022-05-23T10:08:38.784+02:00",
    "updated_at":"2022-05-23T10:08:38.784+02:00"
  }
}

# Works:
json.extract! my_model, :id, :updated_at
json.some_rich_text my_model.some_rich_text.to_s 
{
  "id": 1,
  "updated_at":"2022-05-23T10:08:38.784+02:00",
  "some_rich_text":"<div>Rich text contents</div>"
}

Example with json.array!

# Doesn't work as expected:
json.array! my_collection, :id, :updated_at, :some_rich_text
[
  {
    "id": 1,
    "updated_at":"2022-05-23T10:08:38.784+02:00",
    "some_rich_text":
    {
      "id":1,
      "name":"some_rich_text",
      "body":"<div>Rich text contents</div>",
      "record_type":"MyModel",
      "record_id":20,
      "created_at":"2022-05-23T10:08:38.784+02:00",
      "updated_at":"2022-05-23T10:08:38.784+02:00"
    }
  }
]

# Works:
json.array! my_collection do |item|
  json.extract! item, :id, :updated_at
  json.some_rich_text item.some_rich_text.to_s
end
[
  {
    "id": 1,
    "updated_at":"2022-05-23T10:08:38.784+02:00",
    "some_rich_text":"<div>Rich text contents</div>"
  }
]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions