Profile.find_by
возвращает nil
, то есть: пользователь не найден. Итак, когда вы пытаетесь @profile.user
, вы пытаетесь получить доступ к user
на nil
.
Убедитесь, что профиль существует с user_id
, совпадающим с params[:id]
, и что params[:id]
не является пустым или нулевым.
Чтобы избавиться от фатальной ошибки, нужно проверить, является ли @profile
нулем или нет, прежде чем использовать его:
def update
@profile = Profile.find_by(user_id: params[:id])
if @profile.present?
if @profile.user == current_user
@profile.update(profile_params)
flash[:info] = "Profile successfully updated"
else
end
else
# Profile not found
end
end
Или, вы можете использовать вариацию взрыва find_by
:
Profile.find_by!
Который вызовет исключение, если ничего не будет найдено (из которого вы затем сможете спасти)
Использовать Math.round
, Math.ceil
, или Math.floor
в зависимости от Ваших определенных потребностей округления.
"Для округления чисел к целым числам один из Math.round, Math.ceil и Math.floor предпочтителен, и для желаемого результата, который может быть выражен как целое число со знаком на 32 бита, которому ниже могла бы также удовлетворить битовая операция, описанная".
-http://www.jibbering.com/faq/faq_notes/type_convert.html#tcNumber
Кто-то предложил parseInt. Это идет от строки до интервала, но легко превратить плавание в строку.
parseInt(Math.sqrt(num)+"")
Помните, что независимо от того, что Вы делаете, JavaScript всегда использует плавания. Нет никакого целого типа.
Math.floor сделает это. Сомневайтесь, что даже необходимо перейти к целому числу, все же.
Math.floor(Math.sqrt(num));