Rails chọn helper - Giá trị được chọn mặc định, làm thế nào?


181

Đây là một đoạn mã tôi đang sử dụng:

<%= f.select :project_id, @project_select %>

Làm cách nào để sửa đổi nó để làm cho giá trị mặc định của nó bằng với params[:pid]khi trang được tải?


Tôi không chắc liệu bạn có muốn một dự án mặc định được chọn khi trang được tải hay không, nếu: project_id không được đặt hoặc nếu bạn muốn trả về giá trị của lựa chọn trong hàm băm params như: pid.
Tilendor

Câu trả lời:


222

Điều này nên làm điều đó:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>

5
không có params, options_for_selectlà cách tốt hơn. Nó là tốt cho bất kỳ tình huống, tốt cho chỉnh sửa biểu mẫu quá.
Adriano gửi lại

Đây là TỪ KHÓA: XEM tại chức năng của bạn (tùy chọn_for_select () so với f.select. Hãy nhớ đây là các chức năng khác nhau
FlyingV

126

Sử dụng thuộc tính đúng của thể hiện tại (ví dụ @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>

4
Đây là câu trả lời tốt nhất vì nó hoạt động với select_tagquá. Cảm ơn nó thực sự đã giúp tôi quá.
stephenmurdoch

7
Ngoài ra, bạn có thể thửoptions_for_select(..., f.object.project_id )
khánh thành 18/03/2015

Cám ơn rất nhiều! Tất cả các câu trả lời được chấp nhận khác không nói cách chọn qua biến.
Mike Belanger

52

Đường ray 3.0.9

select options_for_select([value1, value2, value3], default)

Tôi không thể tìm ra giải pháp này cho đến khi tôi nhận thấy khung đóng của bạn xung quanh mảng giá trị TRƯỚC dấu phẩy phân tách giá trị mặc định của bạn ... Tôi đã bỏ lỡ dấu ngoặc này ở đâyvalue3], default
BigRon

33

Vấn đề với tất cả các câu trả lời này là chúng đặt trường thành giá trị mặc định ngay cả khi bạn đang cố chỉnh sửa bản ghi của mình.

Bạn cần đặt mặc định cho giá trị hiện tại của mình và sau đó chỉ đặt nó thành mặc định thực tế nếu bạn không có giá trị. Thích như vậy:

f.select :field, options_for_select(value_array, f.object.field || default_value)

Đối với bất cứ ai không quen thuộc với f.object.fieldbạn luôn luôn sử dụng f.objectsau đó thêm tên trường của bạn vào cuối đó.


3
Đó là một giải pháp sạch và như đã đề cập, bạn muốn chỉ đặt giá trị mặc định cho giá trị mới và giá trị hiện tại khi chỉnh sửa.
đếm0

1
Tôi biết đây là một chủ đề cũ nhưng đối với bất kỳ ai có thể bắt gặp nó, câu trả lời này cũng hoạt động với select2plugin JS. Hoạt động hoàn hảo nếu bạn đang tạo hoặc chỉnh sửa các bản ghi với cùng một hình thức và sử dụng select2, đặc biệt là với văn bản giữ chỗ.
cdouble.bhuck

Tôi nghĩ rằng đây phải là câu trả lời được chấp nhận, như @Mike Bethany cho biết tất cả các câu trả lời khác khi biểu mẫu chỉ được hiển thị cho các bản ghi mới khi phương pháp đường ray là sử dụng lại biểu mẫu. Kudos Mike
Erick Castrillo

22

Thử cái này:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>

Sử dụng Rails 4, params[:pid]không hoạt động, nhưng ví dụ của bạn đã làm.
Eric Wanchic

Điều này làm việc cho tôi khi tôi đang sử dụng một phần bên trong "f.fields_for" Cảm ơn.
Hugo

11

nếu params [: pid] là một chuỗi, nếu nó xuất phát từ một biểu mẫu, thì có lẽ bạn sẽ cần phải sử dụng

params[:pid].to_i  

cho mục chính xác được chọn trong danh sách chọn


Câu trả lời này đã giúp tôi xác định chính xác vấn đề của mình. Hộp chọn của tôi là động và kéo một bộ sưu tập từ cơ sở dữ liệu. Tôi đã cố gắng đưa ra lựa chọn mặc định theo tiêu đề, không phải id của mục. Câu trả lời này đã giúp tôi thấy vấn đề đó và khi tôi nhập @projectbiến của mình bằng id từ bảng cơ sở dữ liệu, thay vì tiêu đề, mã này hoạt động được gắn vào mặt sau của người form.selecttrợ giúp: selected: @projectCảm ơn bạn @danengle
Christopher Warrington

10

Tôi đã tìm thấy giải pháp và tôi thấy rằng tôi khá thiếu kinh nghiệm trong RoR.

Bên trong bộ điều khiển quản lý khung nhìn được mô tả ở trên thêm điều này:

@work.project_id = params[:pid] unless params[:pid].nil?

7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>

3

Tôi không thể làm việc này và thấy rằng tôi cần thêm thuộc tính html "đã chọn" không chỉ vào <option>thẻ chính xác mà còn cho <select>thẻ. Tài liệu của MDN về thuộc tính được chọn của thẻ chọn nói:

đã chọn - Thuộc tính Boolean chỉ ra rằng một tùy chọn cụ thể có thể được chọn ban đầu.

Điều đó có nghĩa là mã sẽ giống như:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}

2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>

0

Ngoài ra, bạn có thể đặt thuộc tính: project_id trong bộ điều khiển, vì đối số đầu tiên của f.select kéo thuộc tính cụ thể đó.


0

Nếu thử in đối tượng f, thì bạn sẽ thấy rằng có f.object có thể được thăm dò để lấy mục đã chọn (áp dụng cho tất cả các phiên bản rails> 2.3)

logger.warn("f #{f.object.inspect}")

vì vậy, sử dụng tập lệnh sau để có tùy chọn được chọn phù hợp:

:selected => f.object.your_field 

0

Nó đã được giải thích, Sẽ cố gắng đưa ra một ví dụ

hãy để danh sách chọn

select_list = { eligible: 1, ineligible: 0 }

Vì vậy, đoạn mã sau dẫn đến

<%= f.select :to_vote, select_list %>

<select name="to_vote" id="to_vote">
  <option value="1">eligible</option>
  <option value="0">ineligible</option>
</select>

Vì vậy, để tạo một tùy chọn được chọn theo mặc định, chúng ta phải sử dụng select: value .

<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>

nếu canvote? trả về true nó được đặt : 1 thì giá trị đầu tiên sẽ được chọn thứ hai.

select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
  <option value="1">eligible</option>
  <option selected="selected" value="0">ineligible</option>
</select>

nếu các tùy chọn được chọn chỉ là một danh sách mảng thay vì vội thì thì lựa chọn sẽ chỉ là giá trị được chọn chẳng hạn nếu

select_list = [ 'eligible', 'ineligible' ]

bây giờ người được chọn sẽ chỉ mất

<%= f.select :to_vote, select_list, selected: 'ineligible' %>

0

Câu trả lời của Mike Bethany ở trên đã hoạt động để đặt giá trị mặc định khi bản ghi mới được tạo và vẫn có giá trị mà người dùng đã chọn hiển thị trong biểu mẫu chỉnh sửa. Tuy nhiên, tôi đã thêm một xác nhận mô hình và nó sẽ không cho phép tôi gửi biểu mẫu. Đây là những gì làm việc cho tôi để xác thực mô hình trên trường và để hiển thị giá trị mặc định cũng như giá trị mà người dùng đã chọn khi ở chế độ chỉnh sửa.

  <div class="field">
    <%= f.label :project_id, 'my project id', class: "control-label" %><br>
    <% if @work.new_record? %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], true), {}, required: true, class: "form-control" %><br>
    <% else %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], @work.project_id), {}, required: true, class: "form-control" %><br>
    <% end %>
  </div>

mẫu chính thức

  validates :project_id, presence: true

-2

Điều này sẽ làm việc cho bạn. Nó chỉ chuyển {:value => params[:pid] }đến biến html_options.

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>

nhưng nó sẽ không chọn mục thích hợp trong phần chọn: S
totocaster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.