2011-01-15 13 views
15

mam następujące:szyny - collection_select wybraną wartość, jeśli została zdefiniowana?

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

Problem jest tylko chcę wybraną wartość 2, jeśli wartość @ permission.role_id jest zerowa.

więc próbowałem:

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

ale wykonane Rails zły. Jak mogę uczynić warunek wybraną wartością na podstawie tego, czy oddzielna zmienna jest zerowa czy nie?

Dzięki

Odpowiedz

23

ok Chyba Czuję się głupio w 2 minuty, ale co z

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

Powodem rozwiązanie nie działa jest to, że if może powrócić nil, nich szuka coś takiego:

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

Gdzie {nil} jest błąd składni

0

Problem polega na tym, że nie można mieć, jeśli w tej pozycji. Tak więc pierwsze rozwiązanie, choć nieco brzydki, jest coś takiego jak brzmienie:

<% 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

umieścić to w swoim pomocnikiem

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

i to w widoku

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

Choć przyjęte rozwiązanie z operatorem potrójnego działa, ja nie sądzę, że jest tak czytelny jak następujące rozwiązanie:

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

to wydaje się niepowodzeniem z błędem zera, jeżeli atrybut obiektu jest zerowa – Rubytastic

+0

try owijania że ostatnia wartość hash w nawiasach. Czy korzystasz z niestandardowego tłumacza? : selected => (@ permission.role_id || 2) w ten sposób, jeśli rola id jest zerowa, zwraca 2. – saneshark

0

znalazłem odpowiedź @ ecoologic za nie działa na mnie jak rubin próbowali interpretować hash jako klucz do ostatniego argumentu, zamiast zaglądać do wartości mieszania dla wartości.

Rozwiązaniem było użycie "splat". Jednak ikonami nie wydają się działać w tym formacie na rolkach, więc użyłem następujące:

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