2013-03-14 27 views
12

Tôi đang cố gắng tạo một đầu vào tùy chỉnh cho đơn vị tiền tệ trong ứng dụng của mình. Tôi đã có những giấy gói bootstrap và vv (tôi nghĩ nó đi kèm với simple_form hoặc với đá quý bootstrap ...), do đó, tôi có thể làm điều gì đó như:đầu vào tùy chỉnh simple_form với trình bao bọc tùy chỉnh

<%= f.input :cost, wrapper => :append do %> 
     <%= content_tag :span, "$", class: "add-on" %> 
     <%= f.number_field :cost %> 
<% end %> 

Và nó hoạt động giống như mong đợi. Vấn đề là: Tôi cần điều tương tự ở nhiều nơi, và tôi không muốn sao chép/dán nó xung quanh.

Vì vậy, tôi quyết định tạo đầu vào tùy chỉnh.

Cho đến bây giờ, tôi có đoạn mã sau:

class CurrencyInput < SimpleForm::Inputs::Base 

    def input 
    input_html_classes.unshift("string currency") 
    input_html_options[:type] ||= input_type if html5? 

    @builder.input attribute_name, :wrapper => :append do |b| 
     # content_tag(:span, "$", class: "add-on") 
     b.text_field(attribute_name, input_html_options) 
    end 
    end 
end 

Nhưng tôi có một số sai sót. Có vẻ như b không đến như mong đợi, vì vậy, nó không hoạt động.

Thực sự có thể thực hiện việc này không? Tôi không thể tìm thấy bất kỳ ví dụ nào và không thể tự làm việc đó.

Xin cảm ơn trước.

+1

Tôi nghĩ điều này sẽ hoạt động: https://gist.github.com/rafaelfranca/5158873 – rafaelfranca

+0

nó hoạt động! Nhưng tôi thực sự muốn làm điều này wrapper trong đầu vào tùy chỉnh của tôi, vì vậy tôi không phải vượt qua các tùy chọn wrapper khi tôi sử dụng đầu vào tiền tệ. Có thể không? Cảm ơn rất nhiều. – caarlos0

+0

Bạn có thể sử dụng tùy chọn wrapper_mappings. Xem https://github.com/plataformatec/simple_form/blob/master/lib/generators/simple_form/templates/config/initializers/simple_form.rb#L123 – rafaelfranca

Trả lời

16

Đó chặn biến không được tồn tại, phương pháp đầu vào của bạn phải như thế này:

class CurrencyInput < SimpleForm::Inputs::Base 

    def input 
    input_html_classes.unshift("string currency") 
    input_html_options[:type] ||= input_type if html5? 

    template.content_tag(:span, "$", class: "add-on") + 
     @builder.text_field(attribute_name, input_html_options) 
    end 
end 

Bây giờ bạn có thể đăng ký một wrapper mặc định để đầu vào tùy chỉnh này trong bạn Mẫu Simple initializer:

config.wrapper_mappings = { :currency => :append } 

Bạn có thể sử dụng như sau:

<%= f.input :cost, :as => :currency %> 
+0

R'SNG NÓ! Cảm ơn bạn rất nhiều Rafael, tôi không biết về thiết lập trình bao bọc theo loại trường. Chúc mừng! – caarlos0

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