jjzjj

templates - Scala/Lift - 试图理解 Lift 同时声称使用有效的 html 和倾向性提升 : tags and tag rewriting in render

coder 2023-08-02 原文

所有七件事 ( http://seventhings.liftweb.net/ ) 当然都很好,但我特别热衷于模板 ( http://seventhings.liftweb.net/templates ) 中的“Lift 支持设计者友好模板”的声明。

作为我学习 Lift 做事方式的步骤之一,我试图创建一个简单的对象创建形式:获取一些参数,将它们用作构造函数参数,然后将对象收起。经过一些研究和实验,我有两个问题:

  • 似乎有相当大的倾向显着重写/修饰代码片段中的模板标记。
  • 表单似乎没有使用有效或可识别的 html 元素。

  • 我的依据是:

    表单示例/文档似乎都是关于特殊提升:标签。 Exploring Lift 建议表单应如下所示:( http://exploring.liftweb.net/master/index-6.html )
    <lift:Ledger.add form="POST">
      <entry:description />
      <entry:amount /><br />
      <entry:submit />
    </lift:Ledger.add>
    

    我不确定这是否是有效的 html5,虽然它可能是有效的 xhtml,但对于我们的设计师 friend 来说,这并不符合让您的模板看起来像真正的 html 的精神。我在别处读到(再也找不到了)我们确实可以选择使用实际的输入标签,但是我们不会得到 Lift 的奇特形式的某些部分连线之类的,段落不是很清楚关于我到底会错过什么,并且这些示例似乎对我编写一个普通的 html 表单并制作一个普通的 html 帖子不感兴趣。

    demo.liftweb.net 示例 (1) 的代码表明您的模板应如下所示 (2)
    <lift:surround with="default" at="content">
      <div class="lift:PersonScreen"></div>
    </lift:surround>
    

    PersonScreen 片段的代码也不完全有启发性,要么 (3)。还有其他几个模板示例,例如只有在特定位置的 ul 标签,才生成一系列复杂的 li,在代码段中包含嵌套元素。当然,您可以在 Scala 中使用 xml 并且它的可读性还不错,但是它仍然到处都是您的标记。这似乎违反了“设计师友好模板”的精神。

    我想了解什么。

    长期以来,我在 webapp 开发中严格遵循两条规则:
  • “代码”中没有标记( Controller 、业务模型)。
  • 模板中没有任何业务逻辑。

  • Idiomatic Lift 似乎完全放弃了第一条规则,完全忽略了第二条规则的值(value)。这些规则对我很有帮助,我还没有准备好跟随似乎违反它们的例子而不理解为什么它不会造成困惑。我想了解为什么在 Lift 中可以在 Snippets 中生成如此多的显示代码。我还想了解为什么模板中的标记很少反射(reflect)输出是可以的。

    我(认为我)想要的:

    我希望我的所有标记都在我的模板中,并且几乎没有异常(exception)。我希望我的片段进行最少的模板修改,通常只替换“叶”标签上的元素文本并可能调整属性值。我想我已经为一个相当复杂的显示示例做了这个,我怀疑我可以使用相同的技术来生成一个普通的 html 表单,然后自己处理参数。如果我希望我的模板看起来像最终结果表单,我需要这样做吗?

    回应和任何其他想法,特别是关于理解关于这些东西的 Lift 心态,将不胜感激。

    谢谢!
  • http://demo.liftweb.net/simple_screen?F674431078927QJVVYD=_
  • https://github.com/lift/examples/blob/master/combo/example/src/main/webapp/simple_screen.html
  • https://github.com/lift/examples/blob/master/combo/example/src/main/scala/net/liftweb/example/snippet/Wizard.scala#L94

  • 编辑

    回应@OXMO456。 (感谢您的回复。)

    我有,他们似乎只是证实了我的担忧:例如我们开始:

    Lift templates contain no executable code. They are pure, raw, valid HTML.



    这太棒了。后来:

    The latter two mechanisms for invoking snippets will not result in valid Html5 templates.



    然而,似乎每个人都在使用这两种机制中的第一种。此外,它说:

    Third, the designers don’t have to worry about learning to program anything in order to design HTML pages because the program execution is abstracted away from the HTML rather than embedded in the HTML.



    但是,我在 OP 中引用的示例片段非常一致地完全以编程方式生成标记。这似乎与以下目标背道而驰:(a) 拥有设计人员友好的模板,因此设计人员不必为 Freemarker 标记而烦恼,以及 (b) 将显示逻辑与业务逻辑分开。

    第二个链接很有帮助和启发性,但它清楚地表明这不是 The Lift Way。然而,Lift Way 似乎也将大量的标记生成拖入片段中,这是(我认为)标记和业务逻辑的巨大复合。那是电梯方式吗?

    最佳答案

    这些是旧式标签,而不是设计人员友好的标签。

    <lift:MySnippet>
      <b:field />
    </lift:MySnippet>
    

    变成
    <div class="lift:MySnippet">
      <div class="field"></div>
    </div>
    

    旧式 Lift 模板是有效的 XML,而不是 XHTML - 所以你不能有未封闭的标签或任何东西 - 这将 Lift 与大多数框架区分开来,大多数框架将模板视为原始字符串,代码位贯穿始终,不考虑标签或结构。

    顺便说一句,在旧式标签中,这些字段都是捏造的 - 它们不是某些标准 Lift 标签集的一部分。我可以很容易地做到:
    <lift:MySnippet>
      <frobnicate:blorb />
    </lift:MySnippet>
    

    只要我的片段代码正在寻找该特定标签。

    Lift 不允许您的模板中有任何逻辑。所有逻辑都发生在您的 Snippet 类中。所以对于上面的设计者友好的例子,我可能有一个这样的片段类:
     class MySnippet { 
       def render(in: NodeSeq): NodeSeq = ".field" #> Text("some text here")
     }
    

    这将产生这个结果:
     <div>
       <div class="field">some text here</div>
     </div>
    

    不可能在 Lift 模板中放入任何逻辑——它们所能做的就是调用 Lift 片段,这是所有工作发生的常规 Scala 类。

    Lift 放弃了在实际代码中不应有任何显示逻辑的规则。为什么?因为它可以生成更多可重用的代码,因为 Scala 在语言中具有强大的 XML 支持,并且因为您的所有逻辑现在都被视为普通的旧 Scala 代码。

    如果我定义了一个名为 CurrentTime 的 Lift 代码段,我可以简单地将它放入任何模板中,它会显示当前时间 - 对于老式 MVC 框架,每个操作方法都需要将时间设置为页面变量,然后需要修改我的模板以将其打印出来.对于更复杂的逻辑,老式框架可能需要模板中的条件。 Lift 不允许 - 您的所有逻辑都是常规的 Scala 代码,符合重构条件,易于测试,并与现代 IDE 兼容。

    关于templates - Scala/Lift - 试图理解 Lift 同时声称使用有效的 html 和倾向性提升 : tags and tag rewriting in render,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6445679/

    有关templates - Scala/Lift - 试图理解 Lift 同时声称使用有效的 html 和倾向性提升 : tags and tag rewriting in render的更多相关文章

    1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

      我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

    2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

      在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

    3. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

      所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

    4. ruby - 如何进行排列以有效地定制输出 - 2

      这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

    5. ruby-on-rails - Ruby url 到 html 链接转换 - 2

      我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

    6. ruby - 分布式事务和队列,ruby,erlang,scala - 2

      我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

    7. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

      我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

    8. ruby - 如何使用 Ruby 将 CSV 文件读入 HTML 表格? - 2

      我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda

    9. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

      是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

    10. ruby - 如何使用 Nokogiri 解析纯 HTML 表格? - 2

      我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315

    随机推荐