Ruby-on-Rails和AlpineJS的实例教程

361 阅读3分钟

Rails和AlpineJS:婚礼时间

请看一下AlpineJS的官方文档。AlpineJS在这里是为了增强已经由服务器渲染的HTML在浏览器中的行为。就像jQuery那样。就像现在的Hotwire for Rails一样。所以你可以把AlpineJS看作是jQuery或Hotwire的一个可行的替代品。一些Rails开发者喜欢Alpine,他们有时称它为 "类似于Tailwind的JS框架",因为它有一个非常可读的、声明性的方法。

创建一个新的Rails应用程序

$> ruby -v  
ruby 3.1.0p0 // you need at least version 3 here  
$> bundle -v  
Bundler version 2.2.11  
$> npm -v  
8.3.0 // you need at least version 7.1 here  
$> yarn -v  
1.22.10

现在打开你常用的工作区,然后输入

mkdir alpinerails && cd alpinerails 
echo "source 'https://rubygems.org'" > Gemfile  
echo "gem 'rails', '7.0.2.3'" >> Gemfile  
bundle install  
bundle exec rails new . --force  

你现在有一个新鲜的、新的、默认的Rails 7应用,安装在 "alpinerails "目录下--这也是这个小应用的名字,非常适合做教程。

第一个Ruby-on-Rails文件

AlpineJS在视图部分,但不幸的是,每个新的Rails应用程序都没有任何视图、模型或控制器。

创建一个控制器。

# inside app/controllers/home_controller.rb  
class HomeController < ApplicationController  
end  

配置一个默认路由。

# inside config/routes.rb  
Rails.application.routes.draw do  
  get "home/index"  
  root to: "home#index"  
end  

现在只需复制/粘贴下面的代码到app/views/home/index.html.erb中。

<!-- inside app/views/home/index.html.erb -->
<h1>Welcome, this is the home page</h1>  

创建一个空的数据库,并运行Web服务器。

~/workspace/alpinerails$>  bin/rails db:create
~/workspace/alpinerails$>  bin/rails db:migrate
~/workspace/alpinerails$>  bin/rails s

如果你在http://localhost:3000,打开你的网页浏览器,你应该看到h1标题 "欢迎,这是主页"。

现在添加AlpineJS

运行

~/workspace/alpinerails$> ./bin/importmap pin alpinejs@3.10.2

现在在你的工作区寻找 "alpinejs "这个词的出现。config/importmap.rb 应该已经改变了。

题外话:在BootrAils,我们更喜欢用ViteJS和Rails,在前端资产管理方面,从开发到生产,它比Rails的默认值更好。然而,对于一个小教程来说,我们坚持使用Rails的 "importmap "功能。

现在是时候让我们的Rails应用程序具有操作Alpine全局对象的能力了

// inside app/javascript/application.js
// add these two lines
import Alpine from "alpinejs"
window.Alpine = Alpine  

显示结果

重新启动你的Rails服务器。在浏览器中显示主页。

localhost

本地主机

在Rails视图中注入一些AlpineJS代码

像这样改变app/views/home/index.html.erb

<h1>Welcome, this is the home page</h1>  

<div x-data="{ count: 0 }">
    <button x-on:click="count++">Increment</button>
    <span x-text="count"></span>
</div>

像这样修改你的application.js

// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
import "@hotwired/turbo-rails"
import "controllers"

import Alpine from "alpinejs"
window.Alpine = Alpine  

document.addEventListener("DOMContentLoaded", function(event) {
  window.Alpine.start();
});

现在你应该看到主页上的计数器了,每次你按下相应的按钮,它都会自动递增。

这就是我们的Rails和AlpineJS的 "Hello world!"教程。

如果你过去已经玩过KnockoutJS或AngularJS或任何同等的库,到目前为止没有什么惊喜。但有一个好消息:仍然有地方可以使用更多的声明性、更简单的JS库。

如果你对任何JS UI库都不熟悉,你可以去看AlpineJS文档的入门部分,它将帮助你掌握模板、事件等概念。

AlpineJS vs Hotwire:集中式状态

正如我们前面所说,AlpineJS可以被看作是Hotwire的替代品,更确切地说,是StimulusJS部分的替代品。

一个明显的区别是对集中式状态的使用。在Redux中,集中状态是 "单一来源",它实际上是每个视图(或视图的每个小组件)应该引用的模型,以显示一些东西。

在Hotwire中,不存在这样的概念:你的HTML唯一的真相来源,这完全不需要任何额外的对象来表示视图的数据。

有很多Rails开发人员都对这一点感到满意和舒适。当然,你的想法可能会有所不同,但就我们的尝试而言,我们发现StimulusJS并不能解决一些角落的问题。而拥有一个集中的状态对于调试和维护最复杂的用例是非常有用的。

总结

从这里开始,可能有很多事情要讲。从服务器注入数据,只属于视图的数据(比如哪个手风琴被打开),如何从AlpineJS发送数据,可能还有更多场景。然而,我们已经涵盖了基础知识:如何将一个现代的、简单的、声明式的JS库注入到你的Rails视图中。请注意,"Hello world!"的教程永远不会接近现实生活中的问题。祝您好运!