8

Slim在项目中遇到了模板引擎问题Sinatra。触发路线时,我有一个要填写的编辑表格。有一个问题HTML select option。加载编辑表单时我需要这样的东西。请注意,Mrs.选项是selected

<select name="person[title]" id="person[title]">
  <option value="Mr.">Mr.</option>
  <option value="Mrs." selected>Mrs.</option>
</select>

我试过了:

option[value="Mrs." "#{person.title == :mrs ? 'selected' : ''}"]

异常是关于属性错误。然后我尝试了这样的事情:

option[value="Mrs." selected="#{person.title == :mrs ? true : false}"]

但随后的输出是这样的:

<option value"Mrs." selected="false">Mrs.</option>

我猜这个字符串"false"被解释为true. 那失败了。我尝试了一些带有圆括号的组合,但无法正常工作。

如何在列表中设置selectedan 的属性?optionselectSlim

4

1 回答 1

11

对于属性,您可以在 之后编写 ruby​​ 代码=,但如果 ruby​​ 代码中有空格,则必须在 ruby​​ 代码周围加上括号:

option[value="1" selected=("selected" if @title=="Mrs.")] "Mrs."

请参阅此处的“Ruby 属性”:http ://rdoc.info/gems/slim/frames 。

括号是可选的,所以你也可以这样写:

option value="1" selected=("selected" if @title=="Mrs.") "Mrs."

或者,您可以使用不同的分隔符来代替括号:

option {value="1" selected=("selected" if @title=="Mrs.")} "Mrs."

这是一些代码:

苗条.苗条:

doctype html
html
  head
    title Slim Examples
    meta name="keywords" content="template language"

  body
    h1 Markup examples
    p This example shows you how a basic Slim file looks like.
    select
      option[value="1" selected=("selected" if @title=="Mr.")] "Mr."
      option[value="2" selected=("selected" if @title=="Mrs.")] "Mrs."

在没有 rails 的独立 ruby​​ 程序中使用 Slim:

require 'slim'

template = Slim::Template.new(
  "slim.slim", 
  pretty: true  #pretty print the html
)

class Person
  attr_accessor :title

  def initialize title
    @title = title
  end
end

person = Person.new("Mrs.")
puts template.render(person)

--output:--
<!DOCTYPE html>
<html>
  <head>
    <title>
      Slim Examples
    </title>
    <meta content="template language" name="keywords" />
  </head>
  <body>
    <h1>
      Markup examples
    </h1>
    <p>
      This example shows you how a basic Slim file looks like.
    </p>
    <select><option value="1">"Mr."</option><option selected="selected" value="2">"Mrs."</option></select>
  </body>
</html>

我猜字符串“false”被解释为true。

是的。评估为 false 的唯一事物是 false 本身和 nil。任何数字(包括0)、任何字符串(包括“”)、任何数组(包括[])等都是真的。

与您的问题无关,但可能对某些未来的搜索者有用......我猜 Slim 在您作为参数传递给渲染的任何对象中查找实例变量。因此,如果您想为模板提供一大堆值,您可以编写:

require 'slim'

template = Slim::Template.new(
  "slim.slim", 
  pretty: true  #pretty print the html
)

class MyVals
  attr_accessor :count, :title, :animals

  def initialize count, title, animals
    @count = count
    @title = title
    @animals = animals
  end
end

vals = MyVals.new(4, "Sir James III", %w[ squirrel, monkey, cobra ])
puts template.render(vals)

苗条.苗条:

doctype html
html
  head
    title Slim Examples
    meta name="keywords" content="template language"

  body
    p =@count
    p =@title
    p =@animals[-1]

OpenStruct 和 Struct 都不能与 render() 一起工作,尽管它们看起来像是天生的候选者。

于 2013-08-27T19:40:00.177 回答