2013-08-27 9 views
6

Ho un problema con il motore di modello Slim in un progetto Sinatra. Ho un modulo di modifica da compilare quando viene attivato il percorso. C'è un problema con HTML select option. Ho bisogno di qualcosa di simile quando viene caricato il modulo di modifica. Si noti che Mrs. opzione è selected:Controllo dell'esistenza di un attributo

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

ho provato:

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

L'eccezione era su un errore attributo. Poi ho provato qualcosa di simile:

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

ma poi l'uscita era qualcosa di simile:

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

Credo che la stringa "false" viene interpretato come true. Questo fallì. Ho provato alcune combinazioni con parentesi tonde ma non riuscivo a farlo funzionare.

Come è possibile impostare l'attributo selected di un option in un elenco select in Slim?

risposta

8

Per un attributo, è possibile scrivere codice Ruby dopo la =, ma se il codice ruby ​​ha spazi in esso, bisogna mettere parentesi attorno al codice ruby:

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

Vedere "Ruby attributi" qui : http://rdoc.info/gems/slim/frames.

Le parentesi sono opzionali, in modo da poter anche scrivere in questo modo:

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

Oppure, invece di staffe, è possibile utilizzare un delimitatore diverso:

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

Eccola con un po ' codice:

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." 

Utilizzando Slim in un programma ruby ​​standalone senza rotaie:

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> 

Credo che la stringa "false" viene interpretato come vero.

Sì. Le sole cose che valutano false sono false e nulle. Qualsiasi numero (incluso 0), qualsiasi stringa (incluso "") e qualsiasi array (incluso []), ecc. Sono tutti veri.

Non pertinente al tuo problema, ma forse utile per qualche ricercatore futuro ... Immagino che Slim analizzi le variabili di istanza in qualunque oggetto tu passi come argomento da renderizzare. Quindi, se vuoi fornire un sacco di valori per il modello, puoi scrivere:

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 [email protected] 
    p [email protected] 
    p [email protected][-1] 

Né OpenStruct né Struct funzionano con render() anche se sembrano candidati naturali.