如何在轨道中使ID成为随机的8位数字母数字?

时间:2013-04-19 03:00:58

标签: ruby-on-rails ruby ruby-on-rails-3

这是我在模型中使用的东西

这是通过API

发布到其他第三方网站的网址

发布模型(post.rb)

"#{content.truncate(200)}...more http://domain.com/post/#{id.to_s}"

“id”指的是帖子ID。如何将其转换为随机的8位字母数字?

现在,它会显示为人们可以改变的内容http://domain.com/post/902

我想要http://domain.com/post/9sd98asj

我知道我可能需要使用类似SecureRandom.urlsafe_base64(8)的内容,但我在哪里以及如何设置?

这就是我在routes.rb中所拥有的。

match '/post/:id', :to => 'posts#show', via: :get, as: :post

2 个答案:

答案 0 :(得分:10)

您只需要向post添加一个属性。属性名称为permalink

尝试跑步:

rails g migration add_permalink_to_posts permalink:string
rake db:migrate

您有两个Active Record Callbacks可供选择:before_savebefore_create(查看两者之间的差异)。此示例使用before_save回调。

注意:对于Rails 3.x

class Post < ActiveRecord::Base
  attr_accessible :content, :permalink
  before_save :make_it_permalink

 def make_it_permalink
   # this can create a permalink using a random 8-digit alphanumeric
   self.permalink = SecureRandom.urlsafe_base64(8)
 end

end

urlsafe_base64

routes.rb文件中:

match "/post/:permalink" => 'posts#show', :as => "show_post"

posts_controller.rb

def index
 @posts = Post.all
end

def show
  @post = Post.find_by_permalink(params[:permalink])
end

最后,这里是观点(index.html.erb):

<% @posts.each do |post| %>
<p><%= truncate(post.content, :length => 300).html_safe %>
   <br/><br/>
   <%= link_to "Read More...", show_post_path(post.permalink) %></p>
<% end %>

答案 1 :(得分:2)

Altering the primary key in Rails to be a string”与您的问题有关。

我会:

  • 在表格中保留默认ID
  • 不定义资源路由,使用匹配编写所需的路由(如match '/post/:code'
  • controller#show上,使用Post.find_by_code(params[:code])