response_status

User 69e88e27

发布于:2026-01-13

# response_status 标签使用指南

## 概述

`response_status` 标签用于设置模板响应的 HTTP 状态码。默认情况下,模板响应状态码为 200(成功),当需要返回其他状态码(如 404、403、422 等)时,可以使用此标签。

## 语法

```liquid
{% response_status 状态码 %}
```

## 支持的状态码范围

支持的状态码范围:**200-599**

- **2xx** - 成功响应(200, 201, 204 等)
- **3xx** - 重定向响应(301, 302, 304 等)
- **4xx** - 客户端错误(400, 401, 403, 404, 422 等)
- **5xx** - 服务器错误(500, 502, 503 等)

## 使用示例

### 1. 成功创建资源(201)

```liquid
{% response_status 201 %}
{% response_type "json" %}
{% layout none %}

{
  "status": "created",
  "id": 123,
  "message": "资源创建成功"
}
```

### 2. 页面未找到(404)

```liquid
{% response_status 404 %}
{% layout none %}

<div class="error-page">
  <h1>404 - 页面未找到</h1>
  <p>抱歉,您访问的页面不存在。</p>
</div>
```

### 3. 禁止访问(403)

```liquid
{% response_status 403 %}
{% layout none %}

<div class="error-page">
  <h1>403 - 禁止访问</h1>
  <p>您没有权限访问此页面。</p>
</div>
```

### 4. 验证失败(422)

常用于表单提交验证失败的情况。

```liquid
{% response_status 422 %}
{% response_type "json" %}
{% layout none %}

{
  "status": "error",
  "message": "验证失败",
  "errors": {
    "email": ["邮箱格式不正确"],
    "password": ["密码长度至少8位"]
  }
}
```

### 5. 使用 Turbo Stream 返回错误状态

```liquid
{% response_status 422 %}
{% response_type "turbo_stream" %}
{% layout none %}

<turbo-stream action="replace" target="form-errors">
  <template>
    <div id="form-errors">
      <ul>
        {% for error in errors %}
          <li>{{ error }}</li>
        {% endfor %}
      </ul>
    </div>
  </template>
</turbo-stream>
```

### 6. 服务器错误(500)

```liquid
{% response_status 500 %}
{% layout none %}

<div class="error-page">
  <h1>500 - 服务器错误</h1>
  <p>服务器遇到了一个错误,请稍后再试。</p>
</div>
```

## 实际应用场景

### 场景 1:自定义 404 页面

在静态模板中创建自定义 404 页面。

```liquid
{%# statics/404.liquid %}
{% response_status 404 %}
{% layout none %}

<!DOCTYPE html>
<html>
<head>
  <title>404 - 页面未找到</title>
  <style>
    .error-container {
      text-align: center;
      padding: 50px;
    }
  </style>
</head>
<body>
  <div class="error-container">
    <h1>404</h1>
    <p>抱歉,您访问的页面不存在。</p>
    <a href="/">返回首页</a>
  </div>
</body>
</html>
```

### 场景 2:表单验证错误

表单提交后,如果验证失败,返回 422 状态码和错误信息。

```liquid
{%# templates/create_comment_turbo_stream.liquid %}
{% response_status 422 %}
{% response_type "turbo_stream" %}
{% layout none %}

{%# 显示验证错误 %}
<turbo-stream action="replace" target="comment-form">
  <template>
    <form id="comment-form">
      {% if errors %}
        <div class="errors">
          <ul>
            {% for error in errors %}
              <li>{{ error }}</li>
            {% endfor %}
          </ul>
        </div>
      {% endif %}
      {% render 'comment_form', comment: comment %}
    </form>
  </template>
</turbo-stream>
```

### 场景 3:API 错误响应

创建 API 接口,返回错误状态码和错误信息。

```liquid
{%# statics/api/error.liquid %}
{% response_status 400 %}
{% response_type "json" %}
{% layout none %}

{
  "status": "error",
  "code": 400,
  "message": "请求参数错误",
  "details": {
    "field": "email",
    "reason": "邮箱格式不正确"
  }
}
```

### 场景 4:资源创建成功

创建资源后返回 201 状态码。

```liquid
{% response_status 201 %}
{% response_type "json" %}
{% layout none %}

{
  "status": "created",
  "id": {{ article.id }},
  "title": {{ article.title | json }},
  "created_at": {{ article.created_at | date: "%Y-%m-%d %H:%M:%S" | json }}
}
```

### 场景 5:权限不足

当用户没有权限访问资源时,返回 403 状态码。

```liquid
{% response_status 403 %}
{% layout none %}

<div class="error-page">
  <h1>403 - 禁止访问</h1>
  <p>您没有权限访问此资源。</p>
  {% if current_user %}
    <a href="/">返回首页</a>
  {% else %}
    <a href="/sign_in">登录</a>
  {% endif %}
</div>
```

## 常见 HTTP 状态码说明

### 2xx 成功

- **200 OK** - 请求成功(默认)
- **201 Created** - 资源创建成功
- **204 No Content** - 请求成功,但没有返回内容

### 3xx 重定向

- **301 Moved Permanently** - 永久重定向
- **302 Found** - 临时重定向
- **304 Not Modified** - 资源未修改

### 4xx 客户端错误

- **400 Bad Request** - 请求参数错误
- **401 Unauthorized** - 未授权,需要登录
- **403 Forbidden** - 禁止访问,权限不足
- **404 Not Found** - 资源未找到
- **422 Unprocessable Entity** - 验证失败

### 5xx 服务器错误

- **500 Internal Server Error** - 服务器内部错误
- **502 Bad Gateway** - 网关错误
- **503 Service Unavailable** - 服务不可用

## 注意事项

1. **状态码范围**:只接受 200-599 范围内的整数,超出范围的值会被忽略,使用默认的 200 状态码

2. **必须为整数**:状态码必须是整数类型,不能是字符串或其他类型

3. **配合其他标签使用**:通常与 `response_type` 和 `layout` 标签配合使用,实现完整的响应控制

4. **优先级**:布局(layout)中设置的 `response_status` 会覆盖模板中的设置

5. **标签顺序**:将 `response_status` 标签放在模板的最前面,与其他控制标签一起

6. **浏览器行为**:某些状态码(如 404、500)可能会触发浏览器的默认错误页面,需要确保返回的内容格式正确

## 常见错误

### 错误 1:状态码超出范围

```liquid
{%# ❌ 错误示例 %}
{% response_status 100 %}  <!-- 超出范围 -->
{% response_status 600 %}  <!-- 超出范围 -->
```

**问题**:超出 200-599 范围的状态码会被忽略,使用默认的 200 状态码。

**解决**:

```liquid
{%# ✅ 正确示例 %}
{% response_status 404 %}
```

### 错误 2:使用字符串而不是数字

```liquid
{%# ❌ 错误示例 %}
{% response_status "404" %}  <!-- 字符串 -->
```

**问题**:字符串类型的状态码会被忽略,使用默认的 200 状态码。

**解决**:

```liquid
{%# ✅ 正确示例 %}
{% response_status 404 %}  <!-- 整数 -->
```

### 错误 3:忘记配合 layout none

```liquid
{%# ❌ 错误示例 %}
{% response_status 404 %}
<!-- 没有设置 layout none,如果返回非 HTML 格式会有问题 -->
```

**问题**:如果使用非 HTML 响应类型,布局的 HTML 结构会影响响应格式。

**解决**:

```liquid
{%# ✅ 正确示例 %}
{% response_status 404 %}
{% layout none %}

<div>404 错误页面</div>
```

## 最佳实践

1. **状态码选择**:根据实际情况选择合适的状态码,遵循 HTTP 标准

2. **错误信息**:返回错误状态码时,提供清晰的错误信息,帮助用户理解问题

3. **配合 response_type**:根据响应格式选择合适的 `response_type`(如 JSON、HTML)

4. **禁用布局**:当使用非 HTML 响应类型时,配合 `{% layout none %}` 禁用布局

5. **标签顺序**:将 `response_status` 标签放在模板的最前面,与其他控制标签一起

6. **测试验证**:在浏览器开发者工具中检查响应的状态码,确保符合预期


## 总结

`response_status` 标签用于设置模板响应的 HTTP 状态码,支持 200-599 范围内的状态码。正确使用此标签可以实现适当的 HTTP 响应,如错误处理、资源创建确认、权限控制等。通常需要与 `response_type` 和 `layout` 标签配合使用,以实现完整的响应控制。

提交反馈