Использование UUID в рельсах - PullRequest
0 голосов
/ 07 февраля 2019

Я начинаю включать UUID как форму обфускации id в мое приложение rails.После создания новой записи у меня есть форма со скрытыми полями, передающими необходимые идентификаторы в качестве значений для связанных моделей, однако я хотел бы передать UUID связанной записи в качестве значения вместо фактического идентификатора, чтобы идентификатор неНикто не может проверить HTML.

Стандартная форма направляющих:

<%= form_for(@share_foo) do |f| %>
  ...
  <%= f.hidden_field :foo_id, value: @foo.uuid %>
  <%= f.hidden_field :foo_user_id, value: current_user.uuid %>
  ...
<% end %>

Действие контроллера:

def create
  ...
    @share_foo.foo_id = Foo.where(uuid: params[:share_foo][:foo_id]).pluck(:id).join("")
    @share_foo.foo_user_id = User.where(uuid: params[:share_foo][:foo_user_id]).pluck(:id).join("")
    if @share_foo.save
      flash.now[:success] = "Foo successfully shared to #{@share_foo.shared_to}!"
    else
      flash.now[:danger] = @share_foo.errors.full_messages.join(", ")
    end
  ...
end

Я знаю, что могуиспользуйте метод to_params в моих моделях, чтобы переопределить рельсы, чтобы использовать uuid вместо id, но я не в том состоянии, чтобы изменить все для реализации этого для каждой модели и внешних ключей.

Это нормально для поиска и принудительной установки значений в моем контроллере?Было бы лучше иметь этот код в модели как-нибудь?(т.е. обратные вызовы / методы модели и т. д.)

Спасибо.

1 Ответ

0 голосов
/ 08 февраля 2019

Почему вы хотите создать uuid в представлении?Создайте его в контроллере, как

def create
  ...
  @share_foo.id = uuid_generate_v4()
  @share_foo.foo_id = Foo.where(uuid: params[:share_foo][:foo_id]).pluck(:id).join("")
  @share_foo.foo_user_id = User.where(uuid: params[:share_foo][:foo_user_id]).pluck(:id).join("")
  if @share_foo.save
    flash.now[:success] = "Foo successfully shared to #{@share_foo.shared_to}!"
  else
    flash.now[:danger] = @share_foo.errors.full_messages.join(", ")
  end
end

Напоминание: чтобы использовать uuid, вам нужно поместить его в schema.rb:

enable_extension "uuid-ossp"
...