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 ```