新手问题 如何在 application.html.slim 中调用模板文件定义的变量?

diguage · 2013年11月04日 · 最后由 diguage 回复于 2013年11月04日 · 4366 次阅读

最近初学 Slim,很喜欢它精简的代码。所以,想把《Ruby on Rails Tutorial》中的代码使用 slim 再来实现一遍。熟悉一下 slim 的使用。在进行到第三章时遇到一个问题。百思不得其解。发出来,希望熟悉的朋友帮忙解答一下。谢谢!

应用场景

应用中每个视图的 Title 都有一部分相同,一部分不同。将相同部分提取到 application.html.slim 中,将不同部分定义到每一个模板文件中,然后在 application.html.slim 中调用该变量来实现每个视图显示不同的 Title。

书中的代码

书中的源代码是使用 erb 来实现的。关键的两端代码如下:

application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>Ruby on Rails Tutorial Sample App | <%= yield(:title) %></title>
  <%= stylesheet_link_tag    "application", media: "all",
                                            "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

home.html.erb

<% provide(:title, 'Home') %>
<h1>Sample App</h1>
<p>
  This is the home page for the
  <a href="http://railstutorial.org/">Ruby on Rails Tutorial</a>
  sample application.
</p>

自己实现的代码

我自己实现的代码中,模板文件使用 slim 来实现。具体代码如下:

application.html.slim

doctype html
html
  head
    title Ruby on Rails Tutorial Sample App | #{yield(:title)}
    = stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true
    = javascript_include_tag "application", "data-turbolinks-track" => true
    = csrf_meta_tags
  body
    = yield

home.html.slim

- title = 'Home'
h1 Sample App
p
  | This is the home page for the 
  a href="http://railstutorial.org/" Ruby on Rails Tutorial
  |  sample application

问题描述

正常情况下,每个页面的title标签应该会根据模板文件第一行定义的title变量来显示不同的名称。但是,现在的情况确实显示不了。所以,有两个问题:

  1. 如何在模板文件中定义变量?如下的方式,在同一个文件可以使用上面#{title}调用。但是,在application.html.slim中这样调用就会报没有定义该变量。

    - title = 'Home'
    
  2. 如何在 application.html.slim 中调用模板文件定义的变量?如下的方式,经过测试。不行,输出为空。

    title Ruby on Rails Tutorial Sample App | #{yield(:title)}
    

参考资料

  1. Ruby on Rails Tutorial--使用布局文件来消除重复
  2. 该问题的代码库--本问题的代码在Ch03-StaticPages分支上。

PS

昨晚@hpyhacking 亮哥已经说了,最好不要在模板文件中定义变量。 我们先解决这个问题, 然后再讨论最佳实践。谢谢!

看 erb 代码,它是调用 helper 定义 title 的,原理不知道,照着翻译用 slim 就是:

- provide(:title, 'Home')

如果你需要用传变量,就用实例变量

- @title = 'xxx'
title = @title

#1 楼 @Rei 这样写

- @title = 'Home'
title Ruby on Rails Tutorial Sample App | #{@title}

就可以了。 谢谢,@Rei

需要 登录 后方可回复, 如果你还没有账号请 注册新账号