2009-12-24 44 views
19

Tôi đang cố gắng tạo trình đơn thả xuống để cho phép người dùng thay đổi trường của mục nhập trong bảng của tôi. Người dùng có một trong ba tùy chọn - nóng, trung bình và lạnh.Ruby on Rails: Trình đơn thả xuống

Tôi đã có text_fields thực chất là điều tương tự cho các trường khác, tất cả đều cập nhật khi người dùng nhấp vào submit_tag.

Có cách nào dễ dàng để triển khai hộp thả xuống và có kết quả được lưu với submit_tag không?

cảm ơn,

-Chris

Trả lời

23

tôi sẽ giả định 2 điều:

  • đó bạn là <%= form_for @model_instance thành ngữ (giải thích về mục 2.2 của this guide).
  • Bạn muốn lưu trữ các giá trị "nóng", "trung bình" và "lạnh" dưới dạng chuỗi (không phải là số 1,2 và 3 hoặc thứ gì đó tương tự) trên cơ sở dữ liệu của bạn.

Hãy nói rằng bạn có hai lĩnh vực, gọi là :name:temperature, điều khiển bởi hai text_fields:

<% form_for @article do |f| %> 
    <%= f.text_field :name %> 
    <%= f.text_field :temperature %> 
    <%= f.submit "Create" %> <% end %> 
<% end %> 

Bây giờ bạn muốn thay đổi: kiểm soát nhiệt độ vào một danh sách thả xuống, chấp nhận nóng, trung bình và lạnh giá trị. Sau đó, bạn có thể làm điều đó theo cách này:

<% form_for @article do |f| %> 
    <%= f.text_field :name %> 
    <%= f.collection_select :temperature, Article::TEMPERATURES, :to_s, :to_s, 
     :include_blank => true 
    %> 
    <%= f.submit "Create" %> <% end %> 
<% end %> 

Bây giờ bạn sẽ phải xác định hằng số Article::TEMPERATURES trong mô hình Bài viết của mình. Nó không phải là rất khó khăn:

class Article < Activerecord::Base 

    TEMPERATURES = ['hot', 'medium', 'cold'] 

Bạn có thể tự hỏi tại sao tôi thêm :include_blank phần trên collection_select. Thao tác này sẽ thêm tùy chọn "trống" vào danh sách thả xuống của bạn. Bạn sẽ cần tùy chọn trống đó khi tạo đối tượng mới, trừ khi bạn muốn có giá trị "mặc định" cho nhiệt độ.

1

Bạn có thể muốn xem xét formtastic đá quý ít mã hơn nhiều.

<% semantic_form_for @stuff do |f| %> 
    <% f.inputs do %> 
    <%= f.input :name %> 
    <%= f.input :temperature, :as => :select, 
       :label => "Degree", :include_blank => false, 
       :collection => [["Hot", 1], ["Medium", 2], ["Cold", 3]] %> 
    <% end %> 
    <%= f.buttons %>  
<% end %> 
38

Đây là câu trả lời cơ bản. Mảng của hai mảng phần tử là phần quan trọng.

<% form_for @entry do |f| %> 
    <%= f.text_field :name %> 
    <%= f.select :temperature, [['Hot','hot'],['Medium','medium'],['Cold','cold']] %> 
    <%= f.submit %> 
<% end %> 
2

Tôi đang làm việc tương tự. Tôi đã nhận được điều này để làm việc bằng cách đơn giản thêm một enum hoặc một hằng số (tương tự như những gì kikito đã nói trước đó) trong mô hình của tôi và sau đó gọi chọn trong mẫu của tôi.

Đây là cách nó có thể hoạt động.

sử dụng liên tục:

lớp ClassName < ActiveRecord :: Base NHIỆT ĐỘ = [ 'nóng', 'trung', 'Lạnh'] cuối

bin/ray nhiệt độ add_column_to_table g di cư: string

_form.html.erb

<%= f.label :temperature %> 
<%= f.select :temperature, ClassName::TEMPERATURE %> 

hoặc

sử dụng enum:

lớp ClassName < ActiveRecord :: Base nhiệt độ enum: [: nóng,: trung bình,: lạnh] cuối

bin/ray nhiệt độ add_column_to_table g di cư: integer

_form.html.erb

<%= f.label :temperature %> 
<%= f.select :temperature, ClassName.temperatures.keys %> 

Hy vọng rằng sẽ giúp bạn!

0

Phù hợp với tất cả các câu trả lời ở trên, hãy nhớ để làm, bước quan trọng cuối cùng này:

Khởi động lại máy chủ của bạn!

Là một newbie, tôi đã tự hỏi tại sao mảng của tôi không hoạt động mặc dù tôi đã làm theo tất cả các bước một cách chính xác.