2013-08-27 37 views
6

Tôi gặp sự cố với công cụ mẫu Slim trong dự án Sinatra. Tôi có một biểu mẫu chỉnh sửa được điền khi tuyến đường được kích hoạt. Đã xảy ra sự cố với HTML select option. Tôi cần một cái gì đó như thế này khi hình thức chỉnh sửa được tải. Chú ý rằng Mrs. lựa chọn là selected:Kiểm soát sự tồn tại của một thuộc tính

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

tôi đã cố gắng:

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

Trường hợp ngoại lệ là về một lỗi thuộc tính. Sau đó, tôi đã cố gắng một cái gì đó như thế này:

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

nhưng sau đó đầu ra là một cái gì đó như thế này:

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

Tôi đoán chuỗi "false" được hiểu như là true. Điều đó thất bại. Tôi đã thử một số kết hợp với dấu ngoặc tròn nhưng không thể làm cho nó hoạt động.

Làm cách nào để đặt thuộc tính selected của số option trong danh sách select trong Slim?

Trả lời

8

Đối với một thuộc tính, bạn có thể viết mã ruby ​​sau khi =, nhưng nếu mã ruby ​​có khoảng trống trong nó, bạn cần phải đặt dấu ngoặc xung quanh mã ruby:

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

Xem "Ruby thuộc tính" ở đây : http://rdoc.info/gems/slim/frames.

Các dấu ngoặc là không bắt buộc, vì vậy bạn cũng có thể viết nó như thế này:

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

Hoặc, thay vì dấu ngoặc, bạn có thể sử dụng một dấu phân cách khác nhau:

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

Dưới đây là với một số mã:

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

Sử dụng Slim trong một chương trình độc lập mà không cần đường ray ruby:

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> 

Tôi đoán chuỗi "false" được hiểu như là sự thật.

Có. Những điều duy nhất đánh giá sai là sai chính nó và không. Bất kỳ số nào (bao gồm 0), bất kỳ chuỗi nào (bao gồm cả "") và bất kỳ mảng nào (bao gồm []), v.v. đều là true.

Không thích hợp với vấn đề của bạn, nhưng có lẽ hữu ích đối với một số người tìm kiếm trong tương lai ... Tôi đoán Slim tra cứu các biến mẫu trong bất kỳ đối tượng nào bạn chuyển làm đối số để hiển thị. Vì vậy, nếu bạn muốn cung cấp toàn bộ các giá trị cho mẫu, bạn có thể viết:

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) 

mỏng.mỏng:

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

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

Cả OpenStruct lẫn Struct đều không hoạt động với kết xuất() mặc dù chúng có vẻ giống như ứng cử viên tự nhiên.

Các vấn đề liên quan