更改控制器页面的位置

Change location of controller pages

我有一个简单的 IHP 应用程序,可以将华氏度转换为摄氏度。

我删除了很多文件,因此应用程序的大部分内容位于以下文件中:

https://github.com/dharmatech/ConvertTemperatureIhp/blob/000-minimal/Web/FrontController.hs

该文件的内容显示如下:

module Web.FrontController where

import IHP.RouterPrelude

import Application.Helper.Controller
import IHP.ControllerPrelude

import IHP.ViewPrelude
import Generated.Types
import Application.Helper.View


instance AutoRoute TemperatureController 

data WebApplication = WebApplication deriving (Eq, Show)

data TemperatureController
    = FormAction
    | ResultAction
    deriving (Eq, Show, Data)

instance Controller TemperatureController where
    action FormAction = respondHtml

            [hsx|
        
            <form action="/Result" method="post">
                <label>Farenheit</label>
                <input type="text" name="farenheit"/>
            </form>            

        |]
    
    action ResultAction = 
        let
            farenheit = IHP.ControllerPrelude.param @Float "farenheit"
            celsius = (farenheit - 32.0) * 5.0 / 9.0
        in
            respondHtml [hsx| 
                <p>Celsius: {celsius}</p>
            |]

instance FrontController WebApplication where
    controllers = 
        [ 
          parseRoute @TemperatureController 
        ]

instance InitControllerContext WebApplication where
    initContext = do
        initAutoRefresh

如果我转到 /Form,我会看到以下页面:

提交该表单后,将显示以下页面:

问题

如您所见,这两个页面分别位于/Form/Result

将这些显示在以下位置的好方法是什么:

/Temperature/Form
/Temperature/Result

代替?

更新

下面是基于 Marc 的回答的新版本代码:

https://github.com/dharmatech/ConvertTemperatureIhp/blob/002-routing/Web/FrontController.hs

查看自定义路由指南https://ihp.digitallyinduced.com/Guide/routing.html#custom-routing

基本上您需要删除 instance AutoRoute TemperatureController 并将其替换为:

instance CanRoute TemperatureController where
    parseRoute' = do
        let form = string "/Temperature/Form" <* endOfInput >> pure FormAction
        let result = string "/Temperature/Result" <* endOfInput >> pure ResultAction
        form <|> result

instance HasPath TemperatureController where
    pathTo FormAction = "/Temperature/Form"
    pathTo ResultAction = "/Temperature/Result"