1- إنشاء نموذج model باسم page بالحقول التالية:

rails g model page title:string content:text slug:string keywords:string description:text published:boolean

2- إنشاء متحكم controller باسم PageController

وظيفة هذا المتحكم هو إظهار الصفحة للمستخدمين وفحصها في حال كانت غير منشورة وإظهار خطأ من نوع 404

class PageController < ApplicationController
  after_action  :check_page,only: [:show]	
  def show
  	@page = Page.find(params[:id])
  end

  private

  def check_page
  	@page = Page.find(params[:id])
    unless @page.published? 
        raise ActiveRecord::RecordNotFound
    end
  end

end


3- إنشاء نموذج model باسم ` DynamicRouter` للتوجيه الديناميكي

class DynamicRouter
  def self.load
    return nil unless ActiveRecord::Base.connection.table_exists? 'pages'
    Rails.application.routes.draw do
     Page.where(:published => true).each do |page|
       get "/#{page.slug}", :to => "page#show", defaults: { id: page.id },as: page.url
     end
    end
  end

  def self.reload
    Rails.application.routes_reloader.reload!
  end
end

4- إنشاء action ضمن نموذج Page لتحديث التوجيه بعد كل عملية تحديث

class Page < ActiveRecord::Base

  after_save :reload_routes

  def reload_routes
    DynamicRouter.reload
  end

end

5- تضمين التوجيه الخاص بالصفحات ضمن ملف التوجيه config/routes.rb

Rails.application.routes.draw do
	DynamicRouter.load
	---
	---
end

اخيرا إنشاء متحكم لعمليات CRUD الخاصة بالنموذج pages

هذا المتحكم يفضل ان يكون ضمن لوحة التحكم بحيث يتم تطبيق authenticate وauthorization لعدم السماح لاي مستخدم عادي إجراء اي تعديلات على الصفحات

class Admin::PagesController < ApplicationController
  before_filter :authenticate_user!
  before_action :set_page, only: [:show, :edit, :update, :destroy]
  # GET /admin/pages
  # GET /admin/pages.json
  def index
    authorize Page
    @pages = Page.all
  end

  # GET /admin/pages/1
  # GET /admin/pages/1.json
  def show
    authorize @page
  end

  # GET /admin/pages/new
  def new
    @page = Page.new
    authorize @page
  end

  # GET /admin/pages/1/edit
  def edit
    authorize @page
  end

  # POST /admin/pages
  # POST /admin/pages.json
  def create
    @page = Page.new(page_params)
    authorize  @page

    respond_to do |format|
      if @page.save
        format.html { redirect_to admin_pages_url, notice: 'تم إضافة الصفحة بنجاح.' }
        format.json { render action: 'show', status: :created, location: @page }
      else
        format.html { render action: 'new' }
        format.json { render json: @page.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /admin/pages/1
  # PATCH/PUT /admin/pages/1.json
  def update
    authorize @page
    respond_to do |format|
      if @page.update(page_params)
        format.html { redirect_to :back, notice: 'تم التعديل بنجاح.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @page.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /admin/pages/1
  # DELETE /admin/pages/1.json
  def destroy
    @page.destroy
    respond_to do |format|
      format.html { redirect_to admin_pages_url, notice: 'تم حذف الصفحة بنجاح.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_page
      @page = Page.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def page_params
      params.require(:page).permit(:title, :slug, :description, :keywords, :content, :published)
    end
end

الوسوم:

التصنيفات:

آخر تعديل: