Thursday, 23 June 2016

Ruby on Rails URL Format




I have a Ruby on Rails application where you can create 'posts'. I started of by using the scaffold generator to give generate the title which is a string and the body which is the content.



Each 'post' has a url of the id, for example /1, /2, /3, etc.



Is there a way to change that to a string of random characters, for example /49sl, /l9sl, etc?



Update



Here is what I have for the posts_controller.rb




class PostsController < ApplicationController
# GET /posts
# GET /posts.json
def index
@posts = Post.all

respond_to do |format|
format.html # index.html.erb
format.json { render json: @posts }
end

end

# GET /posts/1
# GET /posts/1.json
def show
@post = Post.find(params[:id])

respond_to do |format|
format.html # show.html.erb
format.json { render json: @post }

end
end

# GET /posts/new
# GET /posts/new.json
def new
@post = Post.new

respond_to do |format|
format.html # new.html.erb

format.json { render json: @post }
end
end

# GET /posts/1/edit
def edit
@post = Post.find(params[:id])
end

# POST /posts

# POST /posts.json
def create
@post = Post.new(params[:post])

respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render json: @post, status: :created, location: @post }
else
format.html { render action: "new" }

format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end

# PUT /posts/1
# PUT /posts/1.json
def update
@post = Post.find(params[:id])


respond_to do |format|
if @post.update_attributes(params[:post])
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end


# DELETE /posts/1
# DELETE /posts/1.json
def destroy
@post = Post.find(params[:id])
@post.destroy

respond_to do |format|
format.html { redirect_to posts_url }
format.json { head :no_content }

end
end
end

Answer



You can give your posts random URLs by following these 3 steps:



1- In your model (Post.rb), generate a random string for each post before it is saved. For example,



class Post < ActiveRecord::Base

before_create :generate_url_id
def generate_url_id
self.url_id = SecureRandom.urlsafe_base64
end
end


2- In your model (Post.rb), supply a to_param method to override Rails default URL generation. For example:



class Post < ActiveRecord::Base

def to_param
self.url_id
end
end


3- In your controller (PostsController.rb), use a dynamic finder to find your post by its random string. For instance,



class PostsController < ApplicationController
def show

@post = Post.find_by_url_id(params[:id])
...
end
end


I went ahead and put together a complete example and posted it to Github.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...