In search for questions.

Content by Tyches.
Licensed under CC by.

Theme by nostrich, altered by Tyches.

15th November 2009

Text

MonoRail custom scaffolded views

A long time ago, I needed (and still need) Castle MonoRail to use custom NVelocity scaffolded views instead of the embedded ones. This feature is supposed to be present, unfortunately a bug prevents it from picking filenames correctly.

I reported MR-ISSUE-537 with the text above and a patch against svn revision 5884. We’re at r6332, the patch still applies cleanly (read: it has not been checked in). I sure can be comprehensive, but reviewing and applying a patch that trivial is quite a no-brainer.

Scaffolding uses embedded views, unless some are provided locally. Unfortunately, this feature is broken for all scaffolded views except list.vm. It boils down to the various ComputeTemplateName method being vastly incoherent and returning broken paths.

I successfully patched the affected files and rebuild MonoRail. The feature then works as expected.

Here is the patch, if you ever need scaffolding to behave:

Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/RemoveAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/RemoveAction.cs   (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/RemoveAction.cs   (working copy)
@@ -35,7 +35,7 @@

        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return String.Format(@"{0}\{1}removed", controller.Name, Model.Type.Name);
+           return controller.Name + "/remove";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/UpdateAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/UpdateAction.cs   (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/UpdateAction.cs   (working copy)
@@ -36,7 +36,7 @@

        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return controller.Name + "\\update{1}";
+           return controller.Name + "/update";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/CreateAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/CreateAction.cs   (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/CreateAction.cs   (working copy)
@@ -33,9 +33,9 @@
        {
        }

-       protected override string ComputeTemplateName(IControllerContext controllerContext)
+       protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return controllerContext.Name + "\\create";
+           return controller.Name + "/create";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/EditAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/EditAction.cs (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/EditAction.cs (working copy)
@@ -34,7 +34,7 @@

        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return controller.Name + "\\edit";
+           return controller.Name + "/edit";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/NewAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/NewAction.cs  (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/NewAction.cs  (working copy)
@@ -49,7 +49,7 @@
        /// <returns></returns>
        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return String.Format(@"{0}\new{1}", controller.Name, Model.Type.Name);
+           return controller.Name + "/new";
        }

        /// <summary>
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/ConfirmRemoveAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/ConfirmRemoveAction.cs    (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/ConfirmRemoveAction.cs    (working copy)
@@ -37,7 +37,7 @@

        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return controller.Name + "\\confirm";
+           return controller.Name + "/confirm";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)

Enjoy.