首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用base36在URL中编码rails模型id

用base36在URL中编码rails模型id
EN

Stack Overflow用户
提问于 2014-01-03 01:29:04
回答 2查看 1.4K关注 0票数 3

我试图使用base36对rails应用程序的模型id进行编码,在第一个答案here之后,但我不确定我需要做什么。

我把id.to_s(36)放在哪里?是否需要向数据库中添加列?

我希望我的URL成为domain.com/user/rD4g35tQ而不是domain.com/user/3

Ruby1.9.3 Rails 3.2.16

下面是我在控制器中的表演动作:

代码语言:javascript
复制
  def show
    @user = User.find(params[:id])
  end

编辑:这是我的创建动作:

代码语言:javascript
复制
  def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      redirect_to @user
    else
      render 'new'
    end
  end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-03 03:51:08

to_param就是为了这个。它被路由用来生成路径。默认情况下,它返回对象的id,但您可以在模型中重写它,使其成为您想要的任何内容:

代码语言:javascript
复制
class User < ActiveRecord::Base

  def to_param
    id.to_s(36)
  end

end

在控制器中,params:id现在将是您想要的字符串,但是您需要将其转换回真正的主键:

代码语言:javascript
复制
def show
  @user = User.find(params[:id].to_i(36))
end
票数 3
EN

Stack Overflow用户

发布于 2014-01-03 02:11:19

是的,我会在user表中创建一个惟一的列,例如'uuid',以存储编码的字符串并使用它查询用户。

在config/config es.rb中

代码语言:javascript
复制
resources :users

在应用程序/控制器/用户_控制员. in中

代码语言:javascript
复制
def show
  @user = User.where(uuid: params[:uuid]).first
end

def create
  @user = User.new(params[:user])
  if @user.save
    sign_in @user
    redirect_to user_path(@user)
  else
    redirect_to new_user_path
  end
end

实际上,使用编码字符串而不是id的原因是出于安全考虑。我建议不要为此使用base36编码。您可以使用随机字符串,并在创建用户时分配它,例如:

在app/model/user.rb中

代码语言:javascript
复制
class User < ActiveRecord::Base

  attr_readonly :uuid

  before_validation :gen_uuid, on: :create

  validates :uuid, presence: true, uniqueness: true

  # ...

  def to_param
    self.uuid
  end

  private
  def gen_uuid
    self.uuid = RandomToken.genf(32)
  end
end

更新:

定制路由的缺点是失去了_url_path助手,更好的方法是保留resources创建的原始路由,并使用Tim的答案覆盖to_param

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20895015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档