谁不希望预览写入他们的巨大内容?如果您碰巧使用Hotwire运行Rails,则使用小刺激控制器令人惊讶的方便。
我们预览的核心思想是它完全呈现在后端。这是有用的,因为我们可以重用逻辑以供呈现以及实际更改。无论内容发生什么,都可以来自单个Ruby方法。我们将从一个小型控制器和预览方法开始:
我依赖于Request.Raw_Post来获取发送到后端的整个帖子正文。我们还将其呈现为纯文本,避免任何HTML安全逃逸。
现在我们必须为我们要预览的模型打开一种表单。让我们说这是一个推文模型:
< %= form_with(型号:推文)do |形式| %> < div data-controller ="作曲家" > < %如果推文。错误。任何 ? %> < div id =" error_explanation" > < h2>< %=颠覆(推文。错误。计数,"错误")%>禁止将此推文保存:< / h2> < ul> < %推文。错误。每件事错误| %> < li>< %=错误。 full_message%>< / li> < %end%> < / ul> < / div> < %end%> < div类="字段" > < %=表格。标签:身体%> < %=表格。 Text_area:身体,占位符:"键入Tweet",数据:{"作曲家目标" :" Tweet&#34 ;,"行动" :" Input-> Composer#预览" }%> < / div> < div类="行动" > < %=表格。提交%和gt; < / div> < div数据 - composer-target ="输出" > < / div> < / div> < %end%>
如您所见,我调整了具有稍微刺激2数据属性的默认模板。我在DIV中包装了一个数据控制器的DIV,该组成器将是刺激控制器的名称。我将两个数据属性添加到文本区域:数据 - composer-target标识文本区域和数据操作指定的Composer#预览操作。然后在底部,我们只有一个< div>使用Data-Composer-Target设置为输出。此目标将用于从后端插入呈现的HTML。
有关工作的视图,我们需要编写一个Composer_Controller.js,该编写将反应的输入更改从文本区域呈现数据,并将其呈现给输出DIV。
但在我们这样做之前,我们必须确保我们拥有轨道UJS和刺激,因为我们将使用UJS Rails.ajax呼叫。 App / JavaScript / Pack中的Application.js需要看起来与此类似:
从&#34导入导轨; @ Rails / UJS"进口" @ hotwired / turbo-rails"从&#34导入*作为ActiveStorage; @ Rails / ActiveStorage"进口"频道"轨道。 start()激活。 start()// stimulus.js导入{application} from"刺激"从&#34导入{definitedsfromcontext};刺激/ webpack助手" const应用程序=应用程序。 start()const context =要求。背景(" ./controllers",true,/ \。js $ /)应用程序。加载(定义FROMCONTEXT(上下文))
从&#34导入{controller};刺激"从&#34导入导轨; @ Rails / UJS"导出默认类扩展控制器{静态目标= [" Tweet" ,"输出" ] connect(){这个。 preview()} preview(){var content = this。 Tweettarget。价值 ; var preview =这。 outputtarget;轨道。 ajax({type:"帖子",网址:" / preview",contenttype:" text / plain",数据:内容,成功:功能(数据){预览。innerHTML的数据=}})}}
在开始,我们定义了推文和输出目标。我们在Connect()上调用预览以确保将呈现初始预览,然后定义主预览方法。
然后,预览()方法从Tweet目标中获取内容,并将其使用Rails.Ajax调用作为文本/平原发送。一旦我们收到预览响应,我们通过在输出目标上设置innerhtml属性,我们将其直接注入页面的其余部分。
就是这样。如果您没有修改初始方法,则会以粗体显示预览的整个文本。
我正在编写关于Web应用程序部署的介绍性书。网络,流程,SystemD,备份以及您的所有常规嫌疑人。