更改控制器页面的位置
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"
我有一个简单的 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"