hanami / view

Views, templates and presenters for Ruby web applications
http://hanamirb.org
MIT License
173 stars 80 forks source link

Bug: Incorrectly resolved scopes due to the caching #252

Open swilgosz opened 11 months ago

swilgosz commented 11 months ago

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