如何用Stimulus设计一个regex测试功能 pt 2(附代码)

150 阅读2分钟

第一部分中,我们建立了一个测试regex的Stimulus控制器,然而,这个解决方案有一个问题。Ruby和JavaScript的regex实现略有不同。在我们的案例中,我们希望用户使用Ruby的regex实现来验证他们的regex。要做到这一点,我们需要在服务器端评估该regex。

1.添加一个Rails端点

为了在服务器端评估重词,我们需要暴露一个端点,以便Stimulus可以调用Rails应用程序。要做到这一点,我们需要生成一个Rails控制器:

1
bin/rails g controller regex_test create

我们需要设置一个新的路由,我们将其称为 regex_test:

1
resources :regex_test, only: :create

2.导入UJS

现在我们有一个Rails端点,我们想从Stimulus控制器中调用它。JavaScript有许多库可以进行API调用。我们将使用UJS,因为它能自动处理CSRF令牌。

为了使用UJS,我们需要在Stimulus控制器中导入它:

1
import Rails from "@rails/ujs";

然而,只有当我们将JavaScript模块导入代码库时,UJS才会发挥作用。在Rails 7中,我们可以使用导入地图来包含JavaScript模块,而不需要webpack或yarn。

导入地图有一个 "钉 "包的概念。我们可以钉住UJS,将其纳入项目中:

1
bin/importmap pin @rails/ujs

3.从JavaScript调用Rails

导入UJS后,我们可以用它来调用Rails。这里有一个基本的POST请求:

1
2
3
4
5
6
7
Rails.ajax({
  type: 'POST',
  url: `/regex_test`,
  success: (data) => {
    // do something
  }
})

这将向Rails端点发出一个请求,但它不会发送任何参数。要做到这一点,我们需要传入一个数据对象。不幸的是,UJS不支持JSON,所以我们必须将一个JavaScript对象转换成一串参数。

一个对象可以很容易地使用 regexexampleString刺激的目标:

1
2
3
4
const data = {
  regex: this.regexTarget.value,
  exampleString: this.exampleStringTarget.value
}

然后我们可以用 URLSearchParams来将对象转换为字符串:

1
2
3
4
5
6
7
8
Rails.ajax({
  type: 'POST',
  url: `/regex_test`,
  data: new URLSearchParams(data).toString(),
  success: (data) => {
    // do something
  }
})

4.在Rails控制器中添加regex匹配逻辑

在Rails控制器中,我们可以使用参数来评估反义词,使用 Regexp#match?在Rails控制器中,我们可以使用参数来评估搜索结果,并使用 "搜索 "来运行搜索结果与示例字符串:

1
Regexp.new(params["regex"]).match?(params["exampleString"])

然后,我们可以在一个简单的JSON对象中返回结果,以便在客户端使用:

1
2
3
4
5
6
7
class RegexTestController < ApplicationController
  def create
    render json: {
      match: Regexp.new(params["regex"]).match?(params["exampleString"])
    }, status: 200
  end
end

5.在Stimulus控制器中使用Rails响应

现在,Rails控制器返回一个结果,我们可以在Stimulus控制器中使用它。我们可以从响应对象中抽出 match响应对象,并使用该值来设置表单字段的颜色:

1
this.exampleStringTarget.style.borderColor = data.match ? "green" : "red"

下面是Stimulus控制器现在的样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { Controller } from "@hotwired/stimulus"

import Rails from "@rails/ujs";

export default class extends Controller {
  static targets = [ "regex", "exampleString" ]

  test() {
    const data = {
      regex: this.regexTarget.value,
      exampleString: this.exampleStringTarget.value
    }

    Rails.ajax({
      type: 'POST',
      url: `/regex_test`,
      data: new URLSearchParams(data).toString(),
      success: (data) => {
        this.exampleStringTarget.style.borderColor = data.match ? "green" : "red"
      }
    })
  }
}

这就是第二部分的结束。如果我们刷新浏览器并测试一下表单,我们应该看到它和以前一样工作,但评估的是Ruby的regex实现,而不是JavaScript的regex。