view icon indicating copy to clipboard operation
view copied to clipboard

Bug: Incorrectly resolved scopes due to the caching

Open swilgosz opened this issue 2 years ago • 0 comments

Background

When you have two scopes used, in the single view rendering, and you'll use path to the scope file instead of a class, you'll get only the first scope loaded, because of the caching.

Checking the code of the scope builder shows, that it allows to properly recognize the scope by file path, but because of caching, it falls back to the last defined.

image

To Reproduce

TODO: Link the sample App.

I have the app having 2 scopes in use:

 scope(
    "shared/forms/input",
    f: f,
    field_name: :username,
    errors: errors(:username)
      ).render("shared/forms/text_field")
scope('shared/flash', flash: _context.flash).render('layouts/flash_msg')

When I use both used on the same page document, it appears, that the code is tried to be loaded with the first loaded scope class. Flash Message#visible? - is called on the forms/input scope definition, because:

  1. Flash is called in the layout (resolved later)
  2. the form_input is used in the view partial, which is resolved first, to be injected into the layout

image (1)

**NOTE: ** This is not a case if you pass ScopeClass as an argument.

QuickFix: https://github.com/hanamimastery/app/commit/1dadcbf5e4be0227508107190ed9e0e02beb4ada

Expected behavior

I expect the scope builder to properly resolve scopes, no matter if I pass class name, or the file path as argument, and not matter about the ordering of execution.

Your environment

  • Affects my production application: YES
  • Ruby version: 3.2.2
  • OS: All

swilgosz avatar Dec 04 '23 20:12 swilgosz