приведение типов значений хэшей params - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть некоторые проблемы с пониманием функции "params" в RoR.

давайте предположим, что у меня есть пользовательская модель. следующий код apperars в контроллере пользователей, и его функция заключается в обработке запроса POST 'destroy'. Функция «current_user» возвращает текущего зарегистрированного пользователя (я рекомендую экземпляр класса User). сравнивая функцию «current_user == params [: id]» «уничтожить», проверяет, пытается ли пользователь удалить себя

def destroy

    if current_user == params[:id]
        flash[:error] = "you cannot delete yourself!"
    else
        User.find(params[:id]).destroy
        flash[:success] = "user deleted"
    end

    redirect_to(users_path)
end

Так что проблема в том, что код чанка работает хорошо. и я не очень понимаю, почему. Мой опыт работы - 3-летний опыт программирования на C ++ / C # в университете, поэтому я предположил, что такое сравнение должно вызывать приведение типов. В этом случае я думаю, что это будет User obj ---> string obj (ИЛИ string -> User ??? !!!!). Хотя у меня много вопросов о том, как Rails удается сравнивать класс User и класс string, я могу с этим справиться.

Но что если я захочу оптимизировать эту задачу и явно сравнить только идентификаторы: один хранится в params [: id] в виде строки (??), а другой - в хеше current_user ["id"].

первый имеет строковый тип, а второй целочисленный, я не прав? поскольку "current_user [" id "] == params [: id] .to_i" вызывает ошибку, это означает, что params [: id] возвращает экземпляр класса User o_O

спасибо!

Ответы [ 3 ]

0 голосов
/ 26 февраля 2012

Вы должны сделать это

if current_user.id.to_s == params[:id]

params [: id] - это строка, и вы должны сравнить ее с идентификатором current_user, а не current_user

0 голосов
/ 26 февраля 2012

Прежде всего: приобретите приличную рубиновую книгу и прочитайте о ее динамической системе типов и выполнении методов.это должно ответить на большинство ваших вопросов, которые у вас возникли, когда вы пришли из такого языка, как c.

, например с перегрузкой оператора в c, в ruby ​​можно реализовать собственное поведение для таких вещей, как ==.в ruby ​​это очень просто, потому что == это просто метод.таким образом, вы можете написать сравнение для нескольких типов классов, даже если они больше не являются симметричными.

в вашем случае, предоставленный вами код является неправильным.Сравнение current_user с params['id'] всегда даст false.

Вы должны написать что-то вроде этого:

user = User.find params[:id]
if current_user == user
  redirect_to users_path, :error => "you cannot delete yourself!"
else
  user.destroy
  redirect_to users_path, :notice => "user deleted"
end
0 голосов
/ 26 февраля 2012

Ваша переменная current_user должна содержать идентификатор в целочисленном или строковом формате. Или, возможно, в вашей пользовательской модели есть метод to_s, определенный для пользовательских экземпляров. В этом случае при попытке преобразовать объект в строку (для сравнения со строкой) будет вызван этот метод, который будет возвращать идентификатор в формате строки. Вы должны напечатать как переменную current_user, так и params [: id], чтобы быть уверенным.

...