+3

Mô phỏng hệ thống rút gọn link đơn giản bằng Rails

Mở đầu

Chắc hẳn trong chúng ta ai cũng đã từng sử dụng những dịch vụ rút gọn link để phục vụ công việc rồi nhỉ. Ngày xưa mình hay sử dụng chúng để phục vụ trong việc tiếp thị cũng như đặt thuê hàng hóa trên các trang thương mại điện tử. Vậy thì những trang web ấy hoạt động ra sao, thiết kế ra sao thì có ai đã từng nghĩ. Qua bài viết này mình sẽ mô phỏng cách hoạt động của nó, tất nhiên để hệ thống có thể hoạt động tốt với lượng truy cập lớn thì sẽ cần rất nhiều yếu tố khác nữa.

Xây dựng hệ thống

Khởi tạo dự án và các thứ cần thiết

Khởi tạo một dự án mới

rails new short-link-basic

Chạy scaffold

rails g scaffold link origin_url:string shorted_code:string

Trong đó, origin_url là link gốc mà người dùng muốn rút gọn và shorted_code là code dùng để xác định origin_url tương ứng.

Ở view _form.html.erb dùng mỗi origin_url là đủ

rails db:migrate

Coding

Ở bước này mình sẽ chia làm 2 giai đoạn:

Link rút gọn sẽ có dạng: http://localhost:3000/6b8b3e, trong đó 6b8b3e là shorted_code(duy nhất trong hệ thống)

Giai đoạn 1: Tạo link rút gọn

Giao diện sẽ yêu cầu nhập link cần được rút gọn

Ở links_controller.rb

  def create
    @link = Link.new(link_params.merge(shorted_code: generate_shorted_code))

    respond_to do |format|
      if @link.save
        format.html { redirect_to @link, notice: "Link was successfully created." }
        format.json { render :show, status: :created, location: @link }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @link.errors, status: :unprocessable_entity }
      end
    end
  end

private func

  def generate_shorted_code
    shorted_code = SecureRandom.hex(3)
    generate_shorted_code if Link.where(shorted_code: shorted_code).exists?
    shorted_code
  end

generate_shorted_code với code duy nhất, mình không xử lý trùng original_link

Giai đoạn 2: Chạy link rút gọn

Tại routes.rb

get "/:shorted_code", to: "links#redirect", as: :short

Ở links_controller.rb

  def redirect
    if get_origin_link
      redirect_to URI(get_origin_link.origin_url).to_s
    else
      redirect_to root_url
    end
  end

private func

  def get_origin_link
    @get_origin_link = Link.find_by shorted_code: params[:shorted_code]
  end

Mình thực hiện find với shorted_code, có thì sẽ redicrect tới link gốc, ngược lại cho về root url.

Chạy thử

Rất nhanh chóng, chúng ta đã xây dựng được 1 ứng dụng rút gọn link đơn giản.

Sau đây là gif mình chạy demo ✌️ Do file có dung lượng khá lớn nên mình upload 1 bên thứ 3, các bạn click vào link để xem

Kết

Source đã demo trong bài viết: Link github

Trên đây là mô phỏng nho nhỏ cho 1 hệ thống rút gọn link đơn giản. Tất nhiên trong quá trình viết sẽ không tránh khỏi những thiếu sót về hình thức cũng như nội dung, mong bạn đọc góp ý để mình hoàn thiện hơn cho bạn đọc sau.

Cám ơn đã dành thời gian đọc bài chia sẻ của mình 👾👾👾


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí