在Rails表单中使用UUID

时间:2019-02-07 18:36:01

标签: ruby-on-rails ruby forms ruby-on-rails-5 uuid

我开始将id混淆形式的UUID合并到我的rails应用程序中。创建新记录后,我有一个表单,其中包含隐藏字段,将必需的ID作为相关模型的值传递,但是,我想将相关记录的UUID作为值(而不是实际ID)传递,因此该ID不要让任何人都可以查看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方法来覆盖rails以使用uuid而不是id,但是我还不能改变所有内容为每个模型和外键实现该功能。

这样可以在控制器中搜索并强制输入值吗?以某种方式在模型中包含此代码会更好吗? (即模型回调/方法等)

谢谢。

1 个答案:

答案 0 :(得分:0)

为什么要在视图中生成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"