before_create - Ruby on Rails

79
10

Возможный дубликат:
Ruby on Rails Callback, какая разница между: before_save и: before_create?

Я ищу, чтобы заменить текущий идентификатор Ruby on Rails с /1,/2,/3 и т.д. На случайно сгенерированный URL, например /csd8dsv68dvs.

Изучив его, я нашел это в модели post

before_create { self.code = SecureRandom.hex(5) }

Что делает before_create и как я могу реализовать случайный идентификатор?

Обновить

Кажется, я ошибался. Я не хочу менять идентификатор, я просто хочу изменить URL-адрес на случайную строку, которую пользователь не сможет угадать.

спросил(а) 2012-12-06T00:41:00+04:00 7 лет, 8 месяцев назад
1
Решение
79

Отличный камень, который поможет вам с альтернативами ресурсу :id как идентификатор по маршруту - friendly_id. На нем есть RailsCast.

before_create является before_create ActiveRecord и хорошо объясняется как здесь, на SO (как прокомментировали другие), так и в API.

Если вы решили использовать raw

before_create { self.code = SecureRandom.hex(5) }

Вы можете изменить действие своего контроллера, чтобы найти ресурс, используя этот код вместо идентификатора.

def some_action
@resource = ModelClass.find_by_code!(params[:id])
end

Вы должны передать атрибут :code для маршрутов для ресурса в ваших представлениях

resource_path(@resource.code)

где resource_path - метод маршрута для вашего ресурса.

ответил(а) 2012-12-06T00:46:00+04:00 7 лет, 8 месяцев назад
56

Я бы настоятельно рекомендовал не заменять идентификатор Rails, но если вы хотите изменить URL-адрес на что-то менее предсказуемое, значит, вы на правильном пути.

Это очень схожая проблема с решением, созданным "красивыми URL-адресами", которые были решены много раз, например, с жемчужиной Friendly ID. Возможно, вам захочется разветкить драгоценный камень и назвать его "Unfriendly ID" :-)

Независимо от того, работает ли камень из коробки или нет, метод прост - прочитайте код и узнайте от парня, который его написал!

ответил(а) 2012-12-06T00:48:00+04:00 7 лет, 8 месяцев назад
40

Я согласен с двумя другими плакатами; вы, вероятно, не хотите этого делать, а FriendlyID обеспечивает отличный способ работы с альтернативными идентификаторами для записей. Тем не менее, если вы действительно хотите заменить идентификатор, вы можете просто изменить его:

thing = Thing.new
thing.id = some_random_number_generator()
thing.save!

Это уже было описано в Overriding id для создания в ActiveRecord. Серьезно не думайте об этом, если у вас нет веской причины.

ответил(а) 2012-12-06T00:55:00+04:00 7 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема