Dennis Hackethal
@dennis.hackethal·Joined Jun 2024·Ideas
Founder Veritula.
Author. Software engineer. Ex Apple. Translator of The Beginning of Infinity.
dennishackethal.com
#333·Dennis HackethalOP, over 1 year agoHaving explored three different ideas, I believe #302 – having regular helper methods to render Hiccdown structures – is the best.
The idea is not without its flaws, but having to qualify a method name by, say, calling it
idea_forminstead offormis still better than manually having to pass the view context around all the time and not being able to trivially access instance variables.So I’ll stick with #302 for now, which is the status quo already.
I think the thing I’m really fighting here is Rails being object-oriented. Which I can’t do anything about.
Not sure the Rails team realizes how much OOP reduces the extensibility of Rails.
Having explored three different ideas, I believe #302 – having regular helper methods to render Hiccdown structures – is the best.
The idea is not without its flaws, but having to qualify a method name by, say, calling it idea_form instead of form is still better than manually having to pass the view context around all the time and not being able to trivially access instance variables.
So I’ll stick with #302 for now, which is the status quo already.
#303·Dennis HackethalOP, almost 2 years agoHiccdown methods should live in Rails helpers as class methods. That way, the problem described in #302 is solved – methods can be referenced unambiguously:
12rubyProductsHelper.indexStoresHelper.index
#327 applies here, too: no access to instance variables inside helper class methods.
#315·Dennis HackethalOP, almost 2 years agoI don’t think that’s something people would do a lot, but they still easily could:
ProductsRenderer.index(self)
Not as of #330, they couldn’t.
Hiccdown methods should live in their own, separate modules. How about they are called ‘displays’?
12345
module ProductsDisplaydef self.index vc, # …vc.some_helper_methodendend
A benefit of this approach is that, when people start a new Rails app, they may end up putting whatever they’d otherwise put in a helper in a display, since displays have the benefit of having unambiguously resolvable method names.
Hiccdown methods should live in their own, separate classes. How about they are called ‘displays’?
12345
class ProductsDisplaydef index vc, # …vc.some_helper_methodendend
Behind the scenes, the Hiccdown gem would need to make the instance variables available to the display class:
12345678
display = @display_module.newview_context.instance_variables.each do |iv|display.instance_variable_set(iv,view_context.instance_variable_get(iv))end
Then:
12345
class ProductsDisplaydef index vc, # …vc.some_helper_method(@products)endend
#327·Dennis HackethalOP, almost 2 years agoInstance variables are not available inside the methods.
They are: vc.instance_variable_get(:@foo)
#325·Dennis HackethalOP revised almost 2 years agoHiccdown methods should live in their own, separate modules. How about they are called ‘displays’?
12345rubymodule ProductsDisplaydef self.index vc, # …vc.some_helper_methodendendA benefit of this approach is that, when people start a new Rails app, they may end up putting whatever they’d otherwise put in a helper in a display, since displays have the benefit of having unambiguously resolvable method names.
Instance variables are not available inside the methods.
#325·Dennis HackethalOP revised almost 2 years agoHiccdown methods should live in their own, separate modules. How about they are called ‘displays’?
12345rubymodule ProductsDisplaydef self.index vc, # …vc.some_helper_methodendendA benefit of this approach is that, when people start a new Rails app, they may end up putting whatever they’d otherwise put in a helper in a display, since displays have the benefit of having unambiguously resolvable method names.
I’m trying this now. Having to prepend every invocation of a helper method with vc. is getting really old really fast.
Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?
12345
module ProductsRendererdef self.index vc, # …vc.some_helper_methodendend
A benefit of this approach is that, when people start a new Rails app, they may end up putting whatever they’d otherwise put in a helper in a renderer, since renderers have the benefit of having unambiguously resolvable method names.
Hiccdown methods should live in their own, separate modules. How about they are called ‘displays’?
12345
module ProductsDisplaydef self.index vc, # …vc.some_helper_methodendend
A benefit of this approach is that, when people start a new Rails app, they may end up putting whatever they’d otherwise put in a helper in a display, since displays have the benefit of having unambiguously resolvable method names.
Tested, it works.
Tested, it works. self does indeed point to the view_context in the helper. Verified by printing object_ids.
#315·Dennis HackethalOP, almost 2 years agoI don’t think that’s something people would do a lot, but they still easily could:
ProductsRenderer.index(self)
Test this!
#319·Dennis HackethalOP, almost 2 years agoI don’t like the term ‘renderer’ yet. It’s too loaded with meaning, what with Rails already having a
rendermethod in controllers and anotherrendermethod in views…
Maybe ‘Display’. ProductsDisplay
#316·Dennis HackethalOP revised almost 2 years agoHiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?
12345rubymodule ProductsRendererdef self.index vc, # …vc.some_helper_methodendendA benefit of this approach is that, when people start a new Rails app, they may end up putting whatever they’d otherwise put in a helper in a renderer, since renderers have the benefit of having unambiguously resolvable method names.
I don’t like the term ‘renderer’ yet. It’s too loaded with meaning, what with Rails already having a render method in controllers and another render method in views…
Then how would you call this from a helper method?
Then how would you call index from a helper method?
Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?
12345
module ProductsRendererdef self.index vc, # …vc.some_helper_methodendend
Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?
12345
module ProductsRendererdef self.index vc, # …vc.some_helper_methodendend
A benefit of this approach is that, when people start a new Rails app, they may end up putting whatever they’d otherwise put in a helper in a renderer, since renderers have the benefit of having unambiguously resolvable method names.
I don’t think that’s something people would do a lot, but they still easily could: ProductsRenderer.index(self)
#313·Dennis HackethalOP, almost 2 years agoHiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?
12345rubymodule ProductsRendererdef self.index vc, # …vc.some_helper_methodendend
Then how would you call this from a helper method?
Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?
12345
module ProductsRendererdef self.index vc, # …vc.some_helper_methodendend
#303·Dennis HackethalOP, almost 2 years agoHiccdown methods should live in Rails helpers as class methods. That way, the problem described in #302 is solved – methods can be referenced unambiguously:
12rubyProductsHelper.indexStoresHelper.index
That would be mixing class methods an instance methods in Rails helper modules, which typically only contain instance methods. Not idiomatic Rails usage.
If so, there might be a way to bind them to the view_context. Or I could definitely pass the view_context explicitly as the first parameter:
So instead of
1
@helper_module.instance_method(@action_name).bind_call(view_context)
I would do
1
@helper_module.send(@action_name, view_context)
And the parameter list of each Hiccdown method would start accordingly:
12345
module ProductsHelperdef self.index vc #, …# …endend
If so, there might be a way to bind them to the view_context. Or I could definitely pass the view_context explicitly as the first parameter:
So instead of
1
@helper_module.instance_method(@action_name).bind_call(view_context)
I would do
1
@helper_module.send(@action_name, view_context)
And the parameter list of each Hiccdown method would start accordingly:
123456789
module ProductsHelperdef self.index vc #, …vc.some_helper_methodenddef some_helper_method# …endend
If so, there might be a way to bind them to the view_context. Or I could definitely pass the view_context explicitly as the first parameter.
If so, there might be a way to bind them to the view_context. Or I could definitely pass the view_context explicitly as the first parameter:
So instead of
1
@helper_module.instance_method(@action_name).bind_call(view_context)
I would do
1
@helper_module.send(@action_name, view_context)
And the parameter list of each Hiccdown method would start accordingly:
12345
module ProductsHelperdef self.index vc #, …# …endend
#305·Dennis HackethalOP revised almost 2 years agoDoes that mean they wouldn’t have access to the
view_context? If so, calling helper methods from inside these class methods wouldn’t be possible.
If so, there might be a way to bind them to the view_context. Or I could definitely pass the view_context explicitly as the first parameter.
Does that mean they wouldn’t have the view_context? If so, calling helper methods from inside these class methods wouldn’t be possible.
Does that mean they wouldn’t have access to the view_context? If so, calling helper methods from inside these class methods wouldn’t be possible.