-
Notifications
You must be signed in to change notification settings - Fork 447
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rails Engine support #1945
Comments
@joelhawksley @camertron @Spone @boardfish any thought's on this |
Sounds to me like the solution is well understood here, so we can go ahead with the described change. @tkowalewski, would you like to open a pull request for this? |
@boardfish Yep, I will prepare pull request soon. Thanks |
Work in progress (#1951) |
You can leave the issue open while working on the PR. |
@tkowalewski is their any reason you closed this, because it may still be useful to track the progress of this feature(normally we close the issue once the PR has been merged by adding a closses <issue_num> to the PR description) |
Oh, ok I thought it would be better to have conversations in one place (in the PR) |
Thanks for your work on this @tkowalewski – trying to get this working at the moment (but with |
There's another issue with view_component when it comes to isolated engines - it uses a global configuration. This means that a dummy app can configure Right now this is clearly visible with render monkeypatch, preview settings, test controller settings, and url helpers included in view components by default:
|
Sound familiar @reeganviljoen? (#1987) It sounds like we need to consider moving away from global ViewComponent configuration. @boardfish I know you've done a lot of work on our config architecture, what do you think about all of this? |
@joelhawksley I am just on holiday now I can take a better look at this next week and let you know. |
@joelhawksley I think this is a good idea, but this means we need to make config local to something, so do we make it local to a component, an engine, or anything else? |
@reeganviljoen I'm thinking we make it per-component, with the expectation that folks would set config on ApplicationComponent. |
@jfi In this pull request (#1951) I am trying to focus on support for generating components in rails engine. |
@joelhawksley Apologies, this thread fell by the wayside! I'd like to take a deeper look into this – off the top of my head, the first thing that comes to mind is how Rails engines get generated with their own internal I'd want to make sure that that's also compatible with engines, but it's harder to make assumptions about where |
I've been mulling over what this looks like, because I'm expecting that having a config object per component won't be performant. I think what we should do is have an underlying map of object names to config instances, e.g. (pseudocode): {
"ApplicationComponent" => config instance,
"SomeComponent" => another ViewComponent::Config instance
} Then, when
If we're writing to the config:
If we're reading from the config:
We could make this backwards compatible with the current config setup by making it (optionally) possible to write to the config for |
What if we stored the config as class variables at load time and used the inheritance hierarchy builtin to Ruby? |
@joelhawksley @boardfish I have two major concerns with a component based config system as presented above:
|
@reeganviljoen Good point. I think we'd need engine-level config for some things for sure. |
@joelhawksley I was a little averse to this at first, because I think it'd be more difficult to do cleanly – I can't visualise it quite as easily. But it's definitely possible using, say, @reeganviljoen I'm with you there – we'd definitely need to have some separation of what's global and what's not. The line there really comes down to what happens during app initialization, for the most part – things like the capture compatibility patch and preview paths might not be able to be toggled at runtime. |
I've had a look at doing this just now. The thing that makes this difficult is load order – I get the feeling there will need to be separation of app-level config that's checked at app load time and component-level config that we check once The thing that necessitated Config objects that are stored separately in the first instance was load order, but I think @joelhawksley's suggested approach of potentially using class attributes makes a lot of sense on a per-component basis. I wanted to avoid this being a breaking change, but I think that's practically impossible if we're using class attributes on component classes, as we won't be able to set those during engine initialization because they won't have loaded yet. They bring Action View with them, so we also couldn't if we tried. TL;DR: it's a big lift and a breaking change, but it's not impossible! I'll keep on with it. |
@Slotos I'm looking into this properly in #2210 - it's taken some reflection to figure out what to do, and it seems folks are in agreement that the best approach is to go for something of a reset in v4. What I'm doing there is pretty heavily inspired by what you've documented, so a massive thanks for the detail you've added there. I'd be open to chatting if you'd like to go through some things to make sure that the changes to config address what you've described. |
@boardfish I'm happy to hear I was of help. I haven't been using Rails for eight or nine months at this point, and I don't have access to the codebase where I was using view components in an engine anymore. The details are also kinda hazy in my mind. I can provide the context, if that helps, though. The main driving forces were the need for completeness with self-managed isolation and operational budget constraints. I'd been developing a storefront solution. The goal was to get it into the hands of the users of an existing back office application ASAP. At the same time, we wanted to bake in the ability to detach and deploy as a separately deployed solution at a short notice, as well as leave it agnostic in regards specifics of integration during such deployment. This meant that the engine had to look and behave the same way regardless of a specific Rails codebase it was mounted on. Turns out, I didn't know a whole lot about engines back then :) |
I want to use view components in Rails Engine, but component generator produces component file without module (engine) name.
We can fix this manually always after component generation :|, but there should be support for
module_namespacing
like in templates in Rails.How to reproduce
Create new Rails Engine
Add
view_component
as dependency indummy.gemspec
and fix
dummy.gemspec
specs by addinghomepage
,summary
...Install gems
Require view component library in
lib/dummy/engine.rb
by adding at the topGenerate view component
And generated component (
app/components/dummy/example_component.rb
) looks likeExpected behaviour
ViewComponent should generate components within Rails Engine module like all other resources generated for Rails Engine.
Expected component
The fix
To generate component within Rails Engine module we should use
module_namespacing
method in templates.For example
lib/rails/generators/component/templates/component.rb.tt
should looks like:The text was updated successfully, but these errors were encountered: