Skip to content
  • Sean Doyle's avatar
    9c86593c
    Execute `field_error_proc` within view · 9c86593c
    Sean Doyle authored
    Instead of treating it as an anonymous block, execute the
    `ActionView::Base.field_error_proc` within the context of the
    `ActionView::Base` instance.
    
    This enables consumer applications to continue to override the proc as
    they see fit, but frees them from declaring templating logic within a
    `config/initializers/*.rb`, `config/environments/*.rb` or
    `config/application.rb` file.
    
    This makes it possible to replace something like:
    
    ```ruby
    config.action_view.field_error_proc = proc do |html_tag, instance|
      <<~HTML.html_safe
        #{html_tag}
        <span class="errors">#{instance.error_message.to_sentence}</span>
      HTML
    end
    ```
    
    With inline calls to Action View helpers like:
    
    ```ruby
    config.action_view.field_error_proc = proc do |html_tag, instance|
      safe_join [ html_tag, tag.span(instance.error_message.to_sentence, class: "errors") ]
    end
    ```
    
    Or with a view partial rendering, like:
    
    ```ruby
    config.action_view.field_error_proc = proc do |html_tag, instance|
      render partial: "application/field_with_errors", locals: { html_tag: html_tag, instance: instance }
    end
    ```
    
    Then, elsewhere in `app/views/application/field_with_errors.html.erb`:
    
    ```erb
    <%= html_tag %>
    <span class="errors"><%= instance.error_message.to_sentence %></span>
    ```
    9c86593c
    Execute `field_error_proc` within view
    Sean Doyle authored
    Instead of treating it as an anonymous block, execute the
    `ActionView::Base.field_error_proc` within the context of the
    `ActionView::Base` instance.
    
    This enables consumer applications to continue to override the proc as
    they see fit, but frees them from declaring templating logic within a
    `config/initializers/*.rb`, `config/environments/*.rb` or
    `config/application.rb` file.
    
    This makes it possible to replace something like:
    
    ```ruby
    config.action_view.field_error_proc = proc do |html_tag, instance|
      <<~HTML.html_safe
        #{html_tag}
        <span class="errors">#{instance.error_message.to_sentence}</span>
      HTML
    end
    ```
    
    With inline calls to Action View helpers like:
    
    ```ruby
    config.action_view.field_error_proc = proc do |html_tag, instance|
      safe_join [ html_tag, tag.span(instance.error_message.to_sentence, class: "errors") ]
    end
    ```
    
    Or with a view partial rendering, like:
    
    ```ruby
    config.action_view.field_error_proc = proc do |html_tag, instance|
      render partial: "application/field_with_errors", locals: { html_tag: html_tag, instance: instance }
    end
    ```
    
    Then, elsewhere in `app/views/application/field_with_errors.html.erb`:
    
    ```erb
    <%= html_tag %>
    <span class="errors"><%= instance.error_message.to_sentence %></span>
    ```
Loading