控制属性的存在

时间:2013-08-27 07:15:36

标签: html ruby slim-lang

Sinatra项目中的Slim模板引擎存在问题。我有一个编辑表单,当路由被触发时填写。 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。那失败了。我尝试了一些带圆括号的组合,但无法让它起作用。

如何在selected的{​​{1}}列表中设置option的{​​{1}}属性?

1 个答案:

答案 0 :(得分:10)

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

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

参见&#34; Ruby属性&#34;在这里:http://rdoc.info/gems/slim/frames

括号是可选的,因此您也可以这样写:

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

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

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

这里有一些代码:

slim.slim:

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>
  

我猜字符串&#34; false&#34;被解释为真。

是。唯一评价为假的东西本身就是假的,而且是零。任何数字(包括0),任何字符串(包括&#34;&#34;)和任何数组(包括[])等都是正确的。

与您的问题无关,但对未来的搜索者可能有用......我猜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)

slim.slim:

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

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

OpenStruct和Struct都不使用render(),即使它们看起来像是天生的候选者。