Hiccdown Development Notes
#5840·Dennis HackethalOP, about 1 month ago·AI-assistedHiccdown finds an action's helper method through
params[:action]rather than the controller'saction_name. When a controller runs without the router, as inProductsController.action(:show).call(env),params[:action]is nil and rendering raisesNoMethodError: undefined method 'to_sym' for nilinstead of callingProductsHelper#show.
Fixed as of 31cf174, to be released in version 1.6.0.
#5839·Dennis HackethalOP, about 1 month ago·AI-assistedCalling
renderwith options only, such asrender status: :not_foundorrender layout: 'admin', skips the action's helper method and looks for an ERB template instead. Without one, it raisesActionView::MissingTemplate:rubyclass ProductsController < ApplicationControllerdef showrender status: :not_found # MissingTemplate, though ProductsHelper#show existsendendNaming the action works around it:
render :show, status: :not_found.
Fixed as of 9c46c61, to be released in version 1.6.0.
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.
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:
class ProductsController < ApplicationControllerdef showrender status: :not_found # MissingTemplate, though ProductsHelper#show existsendend
Naming the action works around it: render :show, status: :not_found.
#4333·Dennis HackethalOP, 9 months agoWhen an empty block is passed to render, it results in an empty tag '<>'
Fixed as of c36fa5c, version 1.5.2.
When an empty block is passed to render, it results in an empty tag '<>'
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?
Use frame layout for turbo frame requests? https://discuss.rubyonrails.org/t/the-right-way-to-override-render-method/84765/2
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.
Is there a way to teach user-built helpers how to process Hiccdown? Or maybe intercepting capture already took care of this?
Hiccdown should have support for ids and class names in the tag symbol. Like Hiccup.
[:'div#my-id.my-class.another-class']# => <div id="my-id" class="my-class another-class"></div>
It should also allow mixing:
[:'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.
No changes to the text.
Hiccdown methods should live in their own, separate classes. How about they are called ‘displays’?
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:
display = @display_module.newview_context.instance_variables.each do |iv|display.instance_variable_set(iv,view_context.instance_variable_get(iv))end
Then:
class ProductsDisplaydef index vc, # …vc.some_helper_method(@products)endend
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:
ProductsHelper.indexStoresHelper.index
No changes to the text.
Hiccdown methods should live in Rails helpers as instance methods.
It doesn’t really matter. This would be like calling a controller action from a helper method. Not something people do.