Hiccdown Development Notes

  Dennis Hackethal addressed criticism #5840.

Hiccdown finds an action's helper method through params[:action] rather than the controller's action_name. When a controller runs without the router, as in ProductsController.action(:show).call(env), params[:action] is nil and rendering raises NoMethodError: undefined method 'to_sym' for nil instead of calling ProductsHelper#show.

#5840·​Dennis HackethalOP, about 1 month ago·​AI-assisted

Fixed as of 31cf174, to be released in version 1.6.0.

About 1 month ago·​AI-assisted
  Dennis Hackethal archived idea #5839 along with any revisions.
  Dennis Hackethal addressed criticism #5839.

Calling render with options only, such as render status: :not_found or render layout: 'admin', skips the action's helper method and looks for an ERB template instead. Without one, it raises ActionView::MissingTemplate:

ruby
class ProductsController < ApplicationController
def show
render status: :not_found # MissingTemplate, though ProductsHelper#show exists
end
end

Naming the action works around it: render :show, status: :not_found.

#5839·​Dennis HackethalOP, about 1 month ago·​AI-assisted

Fixed as of 9c46c61, to be released in version 1.6.0.

About 1 month ago·​AI-assisted
  Dennis Hackethal posted criticism #5840.

Hiccdown finds an action's helper method through params[:action] rather than the controller's action_name. When a controller runs without the router, as in ProductsController.action(:show).call(env), params[:action] is nil and rendering raises NoMethodError: undefined method 'to_sym' for nil instead of calling ProductsHelper#show.

About 1 month ago·​AI-assisted
  Dennis Hackethal posted criticism #5839.

Calling render with options only, such as render status: :not_found or render layout: 'admin', skips the action's helper method and looks for an ERB template instead. Without one, it raises ActionView::MissingTemplate:

ruby
class ProductsController < ApplicationController
def show
render status: :not_found # MissingTemplate, though ProductsHelper#show exists
end
end

Naming the action works around it: render :show, status: :not_found.

About 1 month ago·​AI-assisted
  Dennis Hackethal archived idea #4333 along with any revisions.
  Dennis Hackethal addressed criticism #4333.

When an empty block is passed to render, it results in an empty tag '<>'

#4333·​Dennis HackethalOP, 9 months ago

Fixed as of c36fa5c, version 1.5.2.

  Dennis Hackethal posted criticism #4333.

When an empty block is passed to render, it results in an empty tag '<>'

  Dennis Hackethal posted idea #4332.

Some Reagent-like way to make things reactive using proc as first element? And then the server keeps track of which procs have been rendered, which items have changed, and re-renders that part of the template in a turbo stream?

  Dennis Hackethal posted criticism #4330.

Redirects result in two additional requests, the first of which is a turbo-stream request that renders nothing, thus (presumably) prompting the browser to make another request for the same resource.

This? https://stackoverflow.com/a/74071278

  Dennis Hackethal posted idea #4329.

Is there a way to teach user-built helpers how to process Hiccdown? Or maybe intercepting capture already took care of this?

  Dennis Hackethal posted idea #4328.

Could the application layout live in ApplicationHelper#layout?

  Dennis Hackethal started a bounty for idea #4327 worth USD 150.00.
  Dennis Hackethal posted idea #4327.

Hiccdown is bug-free.

  Dennis Hackethal archived idea #333 along with any revisions.
  Dennis Hackethal archived idea #303 along with any revisions.
  Dennis Hackethal archived idea #300 along with any revisions.
  Dennis Hackethal archived idea #313 along with any revisions.
  Dennis Hackethal posted criticism #1984.

Hiccdown should have support for ids and class names in the tag symbol. Like Hiccup.

ruby
[:'div#my-id.my-class.another-class']
# => <div id="my-id" class="my-class another-class"></div>

It should also allow mixing:

ruby
[:'div#my-id.my-class.another-class', {id: 'override', class: 'additive'}]
# => <div id="override" class="my-class another-class additive"></div>

In other words, the id from the hash would override the id from the symbol, and the class from the hash would be added to the classes from the symbol.

  Dennis Hackethal marked idea #330 as a criticism. The revision supersedes the old version.

No changes to the text.

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 marked idea #303 as a criticism. The revision supersedes the old version.

No changes to the text.

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
  Dennis Hackethal marked idea #302 as a criticism. The revision supersedes the old version.

No changes to the text.

Hiccdown methods should live in Rails helpers as instance methods.

  Dennis Hackethal posted criticism #859.

Could the errors around layouts be related to this?

  Dennis Hackethal addressed criticism #331.

Not as of #330, they couldn’t.

#331·​Dennis HackethalOP, over 2 years ago

It doesn’t really matter. This would be like calling a controller action from a helper method. Not something people do.