2013-09-27 48 views
7

Tại sao simple_form tạo thẻ đầu vào hai lần cho các trường boolean (một ẩn và trường khác không)?Simple_form: tại sao hai thẻ đầu vào được tạo thay vì một?

Trong simple_form của tôi, tôi có điều này:

<%= form.input :over_phone, as: :boolean, input_html: {checked: true} %>

mà tạo ra này:

<div class="control-group boolean optional order_over_phone"> 
    <label class="boolean optional control-label" for="order_over_phone">Order over phone</label> 
    <div class="controls"> 
    <input name="order[over_phone]" type="hidden" value="0"> 
    <label class="checkbox"> 
     <input checked="checked" class="boolean optional" id="order_over_phone" name="order[over_phone]" type="checkbox" value="1"> 
    </label> 
    </div> 
</div> 

Như bạn có thể thấy, một thẻ đầu vào được ẩn với một giá trị từ 0 và khác được bỏ ẩn với giá trị 1. Nếu tôi gửi biểu mẫu, trong thông số bài đăng, tôi nhận được cả hai giá trị:

order[over_phone]:0 
order[over_phone]:1 

Tôi có một số hành vi ngẫu nhiên trong việc tạo mô hình liên kết với trường boolean này, vì vậy tôi tự hỏi liệu nó có phải do simple_form gây ra hay không. Điều này không xảy ra với các kiểu trường không boolean.

Nếu bạn gặp phải vấn đề tương tự, vui lòng chia sẻ kinh nghiệm của bạn.

Tôi đang sử dụng simple_form 2.1.0.

Trả lời

8

check_box Gotcha đặc điểm kỹ thuật

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

HTML nói hộp kiểm được kiểm soát là không thành công, và do đó các trình duyệt web không gửi chúng. Thật không may điều này giới thiệu một gotcha: nếu một mô hình hóa đơn có một lá cờ trả tiền, và trong các hình thức chỉnh sửa một hóa đơn trả tiền người dùng bỏ chọn hộp kiểm của nó, không có tham số trả tiền được gửi đi. Vì vậy, bất kỳ thành ngữ chỉ định hàng loạt nào như

@invoice.update(params[:invoice]) 

sẽ không cập nhật cờ.

Để ngăn chặn trình trợ giúp này tạo ra một trường phụ trợ ẩn phụ trước hộp kiểm. Trường ẩn có cùng tên và thuộc tính của nó bắt chước hộp kiểm không được chọn.

Bằng cách này, khách hàng chỉ gửi trường ẩn (biểu thị hộp kiểm không được chọn) hoặc cả hai trường. Vì đặc tả HTML cho biết cặp khóa/giá trị phải được gửi theo cùng thứ tự chúng xuất hiện trong biểu mẫu và khai thác tham số là lần xuất hiện cuối cùng của bất kỳ khóa lặp lại nào trong chuỗi truy vấn, hoạt động cho các biểu mẫu thông thường.

+0

Cảm ơn rất nhiều! Điều này giải thích nó. Tôi chỉ tìm ra, vấn đề của tôi với trường "over_phone" ở một nơi khác. – Nurbo

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