how to make ID a random 8 digit alphanumeric in rails?

ruby, ruby-on-rails, ruby-on-rails-3

Solution

You only need to add one attribute to `post`. The attribute name is `permalink`.

Try running:

rails g migration add_permalink_to_posts permalink:string
rake db:migrate

You have twoActive Record Callbacks you can choose from: `before_save` or `before_create` (review the difference between both). This example is using the `before_save` callback.

note : for 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

And in your `routes.rb` file:

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

In `posts_controller.rb`:

def index
 @posts = Post.all
end

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

Finally, here are the views (`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 %>

Problem

This is something I am using inside my model This is the URL that gets posted to another 3rd party website through API Post Model (post.rb) ``` "#{content.truncate(200)}...more http://domain.com/post/#{id.to_s}" ``` The "id" is referring to the post id. How can I convert that into a random 8 digit alphanumeric? Right now, it gets displayed as something that people can alter `http://domain.com/post/902` I want `http://domain.com/post/9sd98asj` I know I probably need to use something like `SecureRandom.urlsafe_base64(8)` but where and how can I set this up? This is what I have in routes.rb ``` match '/post/:id', :to => 'posts#show', via: :get, as: :post ```

Original source

Related problems