2011-01-15 23 views
15

tôi có như sau:đường ray - collection_select giá trị được chọn nếu được xác định?

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => 2 %> 

Vấn đề là tôi chỉ muốn giá trị được lựa chọn 2 nếu giá trị @ permission.role_id là con số không.

vì vậy tôi cố gắng:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {:selected => 2 if @permission.role_id.nil?} %> 

nhưng điều đó làm Rails tức giận. Làm thế nào tôi có thể làm cho một điều kiện được lựa chọn giá trị dựa trên nếu một biến riêng biệt là nil hay không?

Cảm ơn

Trả lời

23

ok Tôi đoán Tôi sẽ cảm thấy ngu ngốc sau 2 phút, nhưng còn khoảng

<%= f.collection_select :role_id, roles, :id, :name, prompt: true, @permission.role_id ? {} : {selected: 2 } %> 

Lý do tại sao giải pháp của bạn không hoạt động là if của bạn có thể trở lại nil, do tìm kiếm một cái gì đó như thế:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {nil} %> 

đâu {nil} là lỗi cú pháp

0

Vấn đề là bạn không thể có nếu ở vị trí đó. Vì vậy, một giải pháp đầu tiên, mặc dù một chút xấu xí, là một cái gì đó như sau:

<% if @permission.role_id.nil? %> 
    <%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {:selected => 2} %> 
<% else %> 
    <%= f.collection_select :role_id, roles, :id, :name, :prompt => true %> 
<% end %> 
3

đặt này trong helper bạn

def selected(permission) 
    if permission.role_id.nil? 
    return 2 
    else 
    ..... 
    end 
end 

và điều này theo quan điểm của bạn

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => selected(@permission) %> 
9

Trong khi các giải pháp được chấp nhận với các nhà điều hành ternary làm việc, tôi không nghĩ rằng nó là khá dễ đọc như các giải pháp sau đây:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => @permission.role_id || 2 %> 
+0

này dường như thất bại với một lỗi nil nếu thuộc tính đối tượng là con số không – Rubytastic

+0

thử gói mà cuối cùng giá trị băm trong ngoặc đơn. Bạn có đang sử dụng một thông dịch viên phi tiêu chuẩn không? : selected => (@ permission.role_id || 2) do đó, nếu role_id là nil, nó trả về 2. – saneshark

0

tôi tìm thấy câu trả lời @ ecoologic đã không làm việc cho tôi như ruby ​​đã cố gắng để giải thích các hash làm khóa cho một đối số cuối cùng thay vì nhìn vào bên trong giá trị băm.

Giải pháp là sử dụng 'splat'. Tuy nhiên sọc dường như không làm việc trong đó định dạng inline, vì vậy tôi sử dụng như sau:

<% selected = @permission.role_id ? {} : {selected: 2 } %> 
<%= f.collection_select :role_id, roles, :id, :name, prompt: true, **selected %> 
Các vấn đề liên quan