2013-08-27 2 views
6

У меня возникла проблема с движком шаблона 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. Это не удалось. Я пробовал некоторые комбинации с круглыми скобками, но не мог заставить его работать.

Как я мог установить атрибут selected в качестве option в select списке Slim?

ответ

8

Для атрибута, вы можете написать рубиновый код после =, но если код рубин имеет пробелы в нем, вы должны поставить скобки вокруг кода Ruby:

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

Смотрите «Рубин атрибуты» здесь : 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." 

Использование Слим в отдельную программу рубина без рельсов:

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, - это ложь и 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) 

тонкий.slim:

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

    body 
    p [email protected] 
    p [email protected] 
    p [email protected][-1] 

Ни OpenStruct, ни Struct не работают с render(), хотя они кажутся естественными кандидатами.

Смежные вопросы