我开始将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
,但是我还不能改变所有内容为每个模型和外键实现该功能。
这样可以在控制器中搜索并强制输入值吗?以某种方式在模型中包含此代码会更好吗? (即模型回调/方法等)
谢谢。
答案 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"