Dennis Hackethal’s avatar

Dennis Hackethal

@dennis.hackethal​·​Joined Jun 2024​·​Ideas

Founder Veritula.
Author. Software engineer. Ex Apple. Translator of The Beginning of Infinity.
dennishackethal.com

  Dennis Hackethal criticized idea #333.

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.

#333​·​Dennis HackethalOP, over 1 year ago

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.

  Dennis Hackethal posted idea #333.

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.

  Dennis Hackethal criticized idea #303.

Hiccdown methods should live in Rails helpers as class methods. That way, the problem described in #302 is solved – methods can be referenced unambiguously:

ruby
ProductsHelper.index
StoresHelper.index
#303​·​Dennis HackethalOP, almost 2 years ago

#327 applies here, too: no access to instance variables inside helper class methods.

  Dennis Hackethal addressed criticism #315.

I don’t think that’s something people would do a lot, but they still easily could: ProductsRenderer.index(self)

#315​·​Dennis HackethalOP, almost 2 years ago

Not as of #330, they couldn’t.

  Dennis Hackethal revised idea #325.

Hiccdown methods should live in their own, separate modules. How about they are called ‘displays’?

ruby
module ProductsDisplay
def self.index vc, # …
vc.some_helper_method
end
end

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’?

ruby
class ProductsDisplay
def index vc, # …
vc.some_helper_method
end
end

Behind the scenes, the Hiccdown gem would need to make the instance variables available to the display class:

ruby
display = @display_module.new
view_context.instance_variables.each do |iv|
display.instance_variable_set(
iv,
view_context.instance_variable_get(iv)
)
end

Then:

ruby
class ProductsDisplay
def index vc, # …
vc.some_helper_method(@products)
end
end
  Dennis Hackethal addressed criticism #328.

They are: vc.instance_variable_get(:@foo)

#328​·​Dennis HackethalOP, almost 2 years ago

That’s way too verbose.

  Dennis Hackethal addressed criticism #327.

Instance variables are not available inside the methods.

#327​·​Dennis HackethalOP, almost 2 years ago

They are: vc.instance_variable_get(:@foo)

  Dennis Hackethal criticized idea #325.

Hiccdown methods should live in their own, separate modules. How about they are called ‘displays’?

ruby
module ProductsDisplay
def self.index vc, # …
vc.some_helper_method
end
end

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.

#325​·​Dennis HackethalOP revised almost 2 years ago

Instance variables are not available inside the methods.

  Dennis Hackethal criticized idea #325.

Hiccdown methods should live in their own, separate modules. How about they are called ‘displays’?

ruby
module ProductsDisplay
def self.index vc, # …
vc.some_helper_method
end
end

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.

#325​·​Dennis HackethalOP revised almost 2 years ago

I’m trying this now. Having to prepend every invocation of a helper method with vc. is getting really old really fast.

  Dennis Hackethal revised idea #316.

Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?

ruby
module ProductsRenderer
def self.index vc, # …
vc.some_helper_method
end
end

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’?

ruby
module ProductsDisplay
def self.index vc, # …
vc.some_helper_method
end
end

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.

  Dennis Hackethal revised criticism #322.

Tested, it works.

Tested, it works. self does indeed point to the view_context in the helper. Verified by printing object_ids.

  Dennis Hackethal addressed criticism #321.

Test this!

#321​·​Dennis HackethalOP, almost 2 years ago

Tested, it works.

  Dennis Hackethal addressed criticism #315.

I don’t think that’s something people would do a lot, but they still easily could: ProductsRenderer.index(self)

#315​·​Dennis HackethalOP, almost 2 years ago

Test this!

  Dennis Hackethal commented on criticism #319.

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…

#319​·​Dennis HackethalOP, almost 2 years ago

Maybe ‘Display’. ProductsDisplay

  Dennis Hackethal criticized idea #316.

Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?

ruby
module ProductsRenderer
def self.index vc, # …
vc.some_helper_method
end
end

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.

#316​·​Dennis HackethalOP revised almost 2 years ago

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…

  Dennis Hackethal revised criticism #314.

Then how would you call this from a helper method?

Then how would you call index from a helper method?

  Dennis Hackethal revised idea #313.

Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?

ruby
module ProductsRenderer
def self.index vc, # …
vc.some_helper_method
end
end

Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?

ruby
module ProductsRenderer
def self.index vc, # …
vc.some_helper_method
end
end

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.

  Dennis Hackethal addressed criticism #314.

Then how would you call this from a helper method?

#314​·​Dennis HackethalOP, almost 2 years ago

I don’t think that’s something people would do a lot, but they still easily could: ProductsRenderer.index(self)

  Dennis Hackethal criticized idea #313.

Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?

ruby
module ProductsRenderer
def self.index vc, # …
vc.some_helper_method
end
end
#313​·​Dennis HackethalOP, almost 2 years ago

Then how would you call this from a helper method?

  Dennis Hackethal posted idea #313.

Hiccdown methods should live in their own, separate modules. How about they are called ‘renderers’?

ruby
module ProductsRenderer
def self.index vc, # …
vc.some_helper_method
end
end
  Dennis Hackethal criticized idea #303.

Hiccdown methods should live in Rails helpers as class methods. That way, the problem described in #302 is solved – methods can be referenced unambiguously:

ruby
ProductsHelper.index
StoresHelper.index
#303​·​Dennis HackethalOP, almost 2 years ago

That would be mixing class methods an instance methods in Rails helper modules, which typically only contain instance methods. Not idiomatic Rails usage.

  Dennis Hackethal revised criticism #308.

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

ruby
@helper_module.instance_method(@action_name).bind_call(view_context)

I would do

ruby
@helper_module.send(@action_name, view_context)

And the parameter list of each Hiccdown method would start accordingly:

ruby
module ProductsHelper
def self.index vc #, …
# …
end
end

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

ruby
@helper_module.instance_method(@action_name).bind_call(view_context)

I would do

ruby
@helper_module.send(@action_name, view_context)

And the parameter list of each Hiccdown method would start accordingly:

ruby
module ProductsHelper
def self.index vc #, …
vc.some_helper_method
end
def some_helper_method
# …
end
end
  Dennis Hackethal revised criticism #307.

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

ruby
@helper_module.instance_method(@action_name).bind_call(view_context)

I would do

ruby
@helper_module.send(@action_name, view_context)

And the parameter list of each Hiccdown method would start accordingly:

ruby
module ProductsHelper
def self.index vc #, …
# …
end
end
  Dennis Hackethal addressed criticism #305.

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.

#305​·​Dennis HackethalOP revised almost 2 years ago

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.

  Dennis Hackethal revised criticism #304.

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.