2013-04-09 41 views
10

Tôi có một mô hình MyModel với thuộc tính được tuần tự a, mô tả một mảng biểu tượng.Hiển thị danh sách hộp kiểm thay vì chọn nhiều

Mã này hoạt động:

<% form_for @my_model do |f| %> 
    <%= f.select :a, MyModel::AS, :multiple => true) %> 
<% end %> 

Các thông số là chính xác:

{ :my_model => { :a => [:a_value1, :a_value2] } } 

Tôi muốn chuyển đổi nhiều này chọn vào một tập hợp các hộp kiểm, như thế này:

<% form_for @my_model do |f| %> 
    <% MyModel::AS.each do |a_value| 
    <%= f.check_box(:a_value) %> 
    <% end %> 
<% end %> 

Nó cũng hoạt động, nhưng các tham số không giống nhau:

{ :my_model => { :a_value1 => 1, :a_value2 => 1 } } 

tôi nghĩ về 2 giải pháp để trở về giải pháp đầu tiên ...

  • Biến đổi của tôi check_box vào , thay thế nhiều lựa chọn, và thêm một số javascript để 'kiểm tra' giá trị chọn khi người dùng clic trên check_box_tags. Sau đó, tham số sẽ giống nhau trực tiếp trong bộ điều khiển.
  • Thêm mã litte vào bộ điều khiển để 'điều chỉnh' các thông số của tôi.

Giải pháp nào kém xấu xí hơn? Hay có cái nào khác không?

Trả lời

28

Tôi đã tìm thấy giải pháp, sử dụng tùy chọn 'nhiều' mà tôi không biết.

<% MyModel::AS.each do |a_value| %> 
    <%= f.check_box(:a, { :multiple => true }, a_value) %> 
<% end %> 

Thông số kết quả hơi lạ, nhưng nó sẽ hoạt động.

{"my_model" => { "a" => ["0", "a_value1", "0", "a_value2", "0"] } 

Chỉnh sửa từ @Viren: đi qua nil vào cuối của hàm như

<%= f.check_box(:a, { :multiple => true }, a_value, nil) %> 

tác phẩm hoàn hảo.

+7

Vượt qua 'nil' ở cuối và nó sẽ hoạt động như kiểm tra dự kiến ​​[this] (http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box) – Viren

+0

@Viren Cảm ơn mẹo. – pierallard

+1

Vui lòng chỉnh sửa câu trả lời của bạn nếu bạn muốn, cũng có lỗi đánh máy ở đó. Sau '<% MyModel :: AS.each do | a_value |' cần '%>'. Chỉ cần nói – ksugiarto

3

Bạn có thể làm điều đó như thế này:

<% MyModel::AS.each do |a_value| %> 
    <%= f.check_box("a[]", a_value) %> 
<% end %> 

Điều này sẽ làm params đến máy chủ như sau

{ :my_model => { :a => [:a_value1, :a_value2] } } 
3

Có một giải pháp đáng nói mà làm cho nó rất dễ dàng để chèn các bản ghi vào cơ sở dữ liệu nếu bạn có mối quan hệ has_and_belongs_to_many hoặc has_manythrough bằng cách sử dụng trình trợ giúp biểu mẫu collection_check_boxes.

<%= f.collection_check_boxes :mymodel_ids, MyModel::AS, :id, :name do |m| %> 
    <%= m.check_box %> <%= m.label %> 
<% end %> 

Sau đó, trong bộ điều khiển chúng tôi sẽ cho phép mymodel_ids thuộc tính:

params.require(:mymodel).permit(:name, mymodel_ids:[]) 

Chúng tôi cũng có thể thiết lập một xác nhận mô hình để yêu cầu ít nhất một trong các hộp kiểm được kiểm tra:

validates :mymodel_ids, presence: true 

Lợi ích bổ sung của phương pháp này là nếu sau này bạn chỉnh sửa bản ghi mymodel và bỏ chọn một trong các hộp kiểm, hồ sơ của nó sẽ bị xóa khỏi many_to_many bảng kết hợp trên save.

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