2

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
user2159586
  • 203
  • 5
  • 16

2 Answers2

11

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 %>
Luke Keller
  • 2,488
  • 3
  • 20
  • 23
rails_id
  • 8,120
  • 4
  • 46
  • 84
  • instead of displaying the final link using view, any idea how I can use the URL inside a model? Here's what I'm trying to put into the model instead of into the view...`"#{content.truncate(200)}...more http://domain.com/post/#{permalink}"` – user2159586 Apr 19 '13 at 04:03
  • this is the error that I get `undefined method 'permalink=' for #` – user2159586 Apr 19 '13 at 04:07
  • @user2159586, you need to add this new field to `attr_accessible`, also you need to migrate at first. – Billy Chan Apr 19 '13 at 04:34
  • @BillyChan, I see. So I need to create a new column inside the post table called 'permalink' and make it `attr_accessible`? – user2159586 Apr 19 '13 at 04:36
3

"Altering the primary key in Rails to be a string" is related to your question.

I would:

  • Leave default ID on table
  • Not define resources routes, writing the needed ones with match (like match '/post/:code')
  • On controller#show, use Post.find_by_code(params[:code]).
Community
  • 1
  • 1
fotanus
  • 19,618
  • 13
  • 77
  • 111