В принятом ответе уже упоминается PEP 238 . Я просто хочу добавить быстрый взгляд за кулисы для тех, кто интересуется тем, что происходит, не читая весь PEP.
Python отображает такие операторы, как +
, -
, *
и /
к специальным функциям, например, a + b
эквивалентен
a.__add__(b)
Что касается деления в Python 2, по умолчанию используется только /
, который отображается на __div__
, и результат зависит от типов ввода (например, int
, float
).
В Python 2.2 была введена функция __future__
division
, которая изменила семантику деления следующим образом (TL; DR из PEP 238):
/
отображается на __truediv__
, который должен «возвращать разумную аппроксимацию математического результата деления» (цитата из PEP 238) //
отображается на __floordiv__
, которая должна возвращаться польский результат /
С Python 3.0 изменения PEP 238 стали поведением по умолчанию, и в объектной модели Python не существует особого метода __div__
.
Если вы хотите использовать тот же код в Python 2 и Python 3, используйте
from __future__ import division
и придерживайтесь семантики PEP 238 /
и //
.
def new
@file = File.new
@file.folder = params[:folder]
end
Решил это. Мне нужно было передать слаг к выбранному атрибуту, а не к имени. Если вы реализуете это, вы, вероятно, используете id
вместо slug
. В любом случае, это то, что сработало для меня.
<%= f.input :folder,
collection: current_user.folders,
label_method: :name,
value_method: :slug,
selected: @folder.slug
%>