تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

آموزش ساخت برنامه Ruby on Rails روی اوبونتو 22.04


۲۱ اسفند ۱۴۰۳

Rails یک فریم‌ورک مبتنی بر Ruby است که می‌تواند توسعه وب را با استفاده از کنوانسیون‌های از پیش تعیین‌شده ساده‌تر کند. این فریم‌ورک مسیریابی، مدیریت داده و بسیاری از امکانات دیگر را به‌صورت استاندارد برای کاربران خود ارائه می‌دهد تا توسعه‌دهندگان بدون درگیری با جزئیات اضافی، بتوانند به بهترین نحو کدنویسی خود را انجام دهند.

Rails بر پایه معماری MVC ساخته شده است که منطق برنامه را در مدل‌ها نگه داشته و از بخش‌های مسیریابی و نمایش جدا می‌کند. این ساختار، با کنوانسیون‌هایی که باعث کاهش تکرار کد و افزایش خوانایی و نگه‌داری در آن می‌شود همراه است.

در این آموزش از لیارا، یک برنامه Rails را خواهبد ساخت که به کاربران این امکان را می‌دهد تا اطلاعاتی درباره کوسه‌ها و رفتار آن‌ها را برای دیگران ارسال کنند.

آنچه در ادامه خواهید خواند:

  • پیش‌نیازها
  • مرحله اول: نصب SQLite3
  • مرحله دوم: ایجاد یک پروژه جدید در Rails
  • مرحله سوم: ساخت اسکافولد اپلیکیشن
  • مرحله چهارم: ایجاد صفحه اصلی اپلیکیشن و تست عملکرد
  • مرحله پنجم: ایجاد نمای روت اپلیکیشن و تست عملکرد
  • مرحله ششم: اجرای مایگریشن‌ها
  • مرحله هفتم: افزودن احراز هویت
  • جمع بندی

پیش‌نیازها

برای انجام این آموزش به موارد زیر نیاز خواهید داشت.

شما به یک کامپیوتر شخصی یا سروری با سیستم‌عامل اوبونتو 22.04 نیاز دارید. در این دستگاه، باید یک کاربر غیر روت (یعنی کاربری که مستقیماً ادمین اصلی نیست اما دسترسی‌های مدیریتی را در اختیار دارد داشته باشید) و همچنین یک فایروال UFW را برای آن تنظیم کنید.

اگر با این موارد آشنا نیستید، می‌توانید آموزش نحوه راه‌اندازی اولیه سرور مجازی با اوبونتو Ubuntu را مطالعه کنید.

ابتدا باید Node.js (نسخه 18.13.0) و npm (نسخه 8.19.3) را بر روی دستگاه نصب کنید.

پس از نصب Node.js , Ruby , rbenv , Rails ld می‌توانید یک پایگاه داده را برای برنامه تان نصب کنید.

برنامه Ruby on Rails

مرحله اول: نصب SQLite3

قبل از اینکه اپلیکیشن Rails را بسازید، به یک پایگاه داده برای ذخیره‌سازی داده‌های کاربران نیاز خواهید داشت. در این قسمت Rails به‌صورت پیش فرض برای استفاده از SQLite تنظیم شده است و این گزینه معمولا برای توسعه بسیار مناسب می‌باشد. چون داده‌های اپلیکیشن به قابلیت های پیچیده برنامه نویسی نیازی ندارد، SQLite برای انجام این فرآیند کافی است.

ابتدا کار در ترمینال خود دستور زیر را برای به‌روزرسانی فهرست بسته‌ها وارد کنید.

sudo apt update

بعد از آن بسته‌های sqlite3 و libsqlite3-dev را نصب کنید.

sudo apt install sqlite3 libsqlite3-dev

دستور بالا SQLite و فایل‌های توسعه مورد نیاز آن را نصب می‌کند.

برای اینکه بتوانید از نصب SQLite مطمئن شوید، حتما نسخه آن را چک کنید.

sqlite3 --version
3.37.2 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5dalt1

مرحله دوم: ایجاد یک پروژه جدید در Rails

با نصب پایگاه داده، می‌توانید پروژه جدیدی را در Rails بسازید و از کدهای پیش‌فرضی که Rails دارد استفاده کنید.

برای ساخت پروژه جدید با نام sharkapp، دستور زیر را وارد در آن وارد کنید.

rails new sharkapp

در خروجی نشان می‌دهد که Rails برای پروژه‌تان چه فایل‌ها و پوشه‌هایی را ساخته است. تمامی این خروجی‌ها فایل‌ها، دایرکتوری‌ها و دستورات مهم را نشان می‌دهد.

     create  
     . . .  
     create  Gemfile 
     . . .  
     create  app 
     . . .  
     create  app/controllers/application_controller.rb
     . . .  
     create  app/models/application_record.rb
     . . .  
     create  app/views/layouts/application.html.erb
     . . .  
     create  config
     create  config/routes.rb
     create  config/application.rb
     . . .  
     create  config/environments
     create  config/environments/development.rb
     create  config/environments/production.rb
     create  config/environments/test.rb
     . . .  
     create  config/database.yml
     create  db
     create  db/seeds.rb
     . . .  
         run  bundle install
     . . .  
Bundle complete! 15 Gemfile dependencies, 69 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
      . . .  

با انجام تمامی این مراحل، شما پروژه Rails جدید خود را با موفقیت ساخته‌اید و همه‌ی فایل‌های ضروری برای شروع کار را در اختیار خود دارید.

در مطلب زیر به‌صورت مختصر برخی فایل‌ها و پوشه‌های Rails که ایجاد می‌شوند را توضیح خواهیم داد.

  • Gemfile: این فایل لیستی از پکیج‌های نرم‌افزاری Ruby برای اپلیکیشن شما است که با استفاده از این فایل می‌توانید نرم‌افزاری پروژه‌تان را مدیریت کنید.
  • app: دایرکتوری app جایی است که کدهای اصلی اپلیکیشن شما در آن قرار دارد. این فسمت شامل مدل‌ها، کنترلرها، ویوها، منابع، هِلپرها و میلرها است که ساختار اپلیکیشن شما را تشکیل می‌دهند و به شما در ساخت آن کمک می‌کند.
  • config: دایرکتوری config تنظیمات پیکربندی اپلیکیشن شما را تشکیل می‌دهد که شامل:
    • config/routes.rb: این فایل مسیرهای اپلیکیشن شما را نشان می‌دهد.
    • config/application.rb: تنظیمات عمومی برای اجزای مختلف اپلیکیشن است و در این فایل قرار دارد.
    • config/environments: تنظیمات پیکربندی برای محیط‌های مختلف اپلیکیشن است که در این دایرکتوری قرار دارد.
    • config/database.yml: تنظیمات پیکربندی پایگاه داده در این فایل است.
  • db: این پوشه دایرکتوری با نام migrate , فایل‌های schema.rb , seeds.rb را دارد.

پس از تنظیم همه چیز، وارد دایرکتوری پروژه‌ی sharkapp خود شوید.

cd sharkapp

🔶برای ادامه مطالعه و یادگیری: مقایسه اوبونتو و دبیان؛ راهنمای انتخاب بهترین توزیع لینوکس

برای اینکه اطمینان حاصل کنید که اپلیکیشن شما به درستی کار می‌کند، سرور Rails را اجرا کنید. برای این کار، کافی است که دستور زیر را وارد کنید.

rails server

Rails به‌صورت پیش‌فرض به localhost متصل می‌شود و این معنا را می‌دهد که می‌توانید با رفتن به localhost:3000 در مرورگر خود، اپلیکیشن‌تان را مشاهده کنید.

⚠️توجه: اگر روی یک سرور توسعه کار می‌کنید، قبل از اینکه برنامه خود را اجرا کنید، مطمئن شوید که اتصال‌ها روی پورت 3000 برای شما مجاز باشند. در غیر این صورت، ممکن است نتوانید به اپلیکیشن خود دسترسی پیدا کنید.

 ایجاد یک پروژه جدید در Rails

برای اطمینان از این موضوع، می‌توانید تنظیمات فایروال یا پیکربندی سرور را بررسی کنید و در صورت نیاز، پورت 3000 را باز کنید.

sudo ufw allow 3000

سپس سرور را با استفاده از --binding و آدرس IP سرور راه‌اندازی کنید.

rails server --binding=your_server_ip

حالا به آدرس http://your_server_ip:3000 در مرورگر خود بروید تا بتوانید صفحه پیش‌فرض Rails را مشاهده کنید.

زمانی که کارتان با آن تمام شد، می‌توانید CTRL+C در ترمینال را بزنید و سرور را متوقف کنید.

با ساخت اپلیکیشن و راه‌اندازی آنف می‌توانید از کدهای اولیه Rails برای ساخت اپلیکیشن خود استفاده کنید.

مرحله سوم: ساخت اسکافولد اپلیکیشن

برای ساخت اپلیکیشن کوسه، به یک مدل نیاز دارید که بتواند داده‌ها، ویوهایی را برای خود بسازید. برای این کار از دستور rails generate scaffold استفاده کنید.

این دستور بخش‌های مختلفی از اپلیکیشن را می‌سازد که شامل:

  1. مدل (Model): برای کار با داده‌ها و ارتباط با پایگاه داده از آن استفاده می‌شود.
  2. مهاجرت پایگاه داده: برای ایجاد یا تغییر جداول در پایگاه داده از آن مورد استفاده قرار می‌گیرد.
  3. کنترلر (Controller): برای مدیریت درخواست‌های کاربر و پردازش داده‌ها کاربرد دارد.
  4. ویوها (Views): صفحات و قالب‌هایی که اطلاعات را به کاربر نمایش می‌دهند را دارا است.
  5. قالب‌ برای پارتال‌ها، هِلپرها و تست‌ها: فایل‌های اضافی برای بهبود عملکرد و تست اپلیکیشن را دارد.

دستور generate scaffold در Rails بسیاری از فعالیت‌های مربوط به ساخت بخش‌های اصلی اپلیکیشن را، به صورت خودکار انجام می‌دهد. این دستور شامل نام مدل‌ها و فیلدهایی است که در جدول پایگاه داده ساخته شوند.

Rails از Active Record برای مدیریت ارتباط بین داده‌های اپلیکیشن و پایگاه داده استفاده می‌کند.

  • مدل‌ها در Rails کلاس‌هایی از نوع Ruby هستند که از ActiveRecord::Base ارث‌بری می‌کنند.
  • هر مدل نشان‌دهنده یک جدول در پایگاه داده است.
  • هر object، معادل یک ردیف از جدول خواهد بود.

برای ایجاد مدل، کنترلر و ویوهای مربوط به کوسه از دستور زیر استفاده کنید.

rails generate scaffold Shark name:string facts:text

در این دستور، دو گزینه name:string و facts:text مشخص می‌کنند که در جدول پایگاه داده چه فیلدهایی ساخته شوند و هرکدام چه نوع داده‌ای را داشته باشند.

  • name:string: یک فیلد متنی کوتاه برای ذخیره نام (مثلاً نام کاربر یا محصول انتخابی شما).
  • facts:text: یک فیلد متنی طولانی‌تر که می‌تواند اطلاعات بیشتری را در خود نگه دارد (مثلاً توضیحات یا توضیحات محصول).

نوع داده text برای متن های طولانی مناسب‌تر هستند.

بعد از اجرای این دستور، خروجی به شما نشان می‌دهد که چه فایل‌هایی برای شما ایجاد شده‌ است.

      invoke  active_record
      create    db/migrate/20190804181822_create_sharks.rb
      create    app/models/shark.rb
      . . .
      invoke  resource_route
       route    resources :sharks
      invoke  scaffold_controller
      create    app/controllers/sharks_controller.rb
      invoke    erb
      create      app/views/sharks
      create      app/views/sharks/index.html.erb
      create      app/views/sharks/edit.html.erb
      create      app/views/sharks/show.html.erb
      create      app/views/sharks/new.html.erb
      create      app/views/sharks/_form.html.erb
      . . .

این خروجی به شما نشان می‌دهد که چند فایل برای مدیریت مدل، کنترلر و ویوهای مربوط به مدل کوسه ایجاد شده‌اند. این فایل ها به شما این امکان را می‌دهند که داده‌های کوسه تان را از طریق CRUD حفظ کنید.

Rails مدل کوسه را در فایل app/models/shark.rb ایجاد کرده و یک مهاجرت پایگاه داده نیز به نام db/migrate/20190804181822_create_sharks.rb را برای آن ساخته است. به یاد داشته باشید که امکان دارد تا زمان‌برچسب فایل مهاجرت شما با خروجی متفاوت باشد.

همچنین یک کنترلر به نام app/controllers/sharks_controller.rb و ویوهای مربوط به عملیات‌های CRUD اپلیکیشن شما در پوشه app/views/sharks ایجاد شده‌اند. در بین تمامی این ویوها یک partial به نام _form.html.erb وجود دارد که کدی را برای استفاده در تمام ویوها برای شما فراهم می‌کند.

Rails یک مسیر منابعی جدیدی را به نام resources :sharks به فایل config/routes.rb اضافه کرده است. که این امر باعث می‌شود که مسیریاب Rails بتواند درخواست‌های HTTP ورودی را با کنترلر sharks و ویوهای مربوطه مطابقت دهد.

برای درک بهتر فایل کنترلر، دستور زیر را در ترمینال خود وارد کنید.

cat app/controllers/sharks_controller.rb
class SharksController < ApplicationController
  before_action :set_shark, only: %i[ show edit update destroy ]

  # GET /sharks or /sharks.json
  def index
    @sharks = Shark.all
  end

  # GET /sharks/1 or /sharks/1.json
  def show
  end

  # GET /sharks/new
  def new
    @shark = Shark.new
  end

  # GET /sharks/1/edit
  def edit
  end

  # POST /sharks or /sharks.json
  def create
    @shark = Shark.new(shark_params)

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

  # PATCH/PUT /sharks/1 or /sharks/1.json
  def update
    respond_to do |format|
      if @shark.update(shark_params)
        format.html { redirect_to shark_url(@shark), notice: "Shark was successfully updated." }
        format.json { render :show, status: :ok, location: @shark }
      else
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @shark.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /sharks/1 or /sharks/1.json
  def destroy
    @shark.destroy

    respond_to do |format|
      format.html { redirect_to sharks_url, notice: "Shark was successfully destroyed." }
      format.json { head :no_content }
    end
  end

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

    # Only allow a list of trusted parameters through.
    def shark_params
      params.require(:shark).permit(:name, :facts)
    end
end

📍نکته:

در SharksController، متدهای مختلفی برای انجام عملیات‌های CRUD که شامل (ایجاد، خواندن، ویرایش و حذف) هستند تعریف شده‌ است. تمامی این متدها مسئول دریافت اطلاعات از مدل‌ها و ارسال آن‌ به ویوها را دارند. علاوه بر این، متدهای اضافی برای مدیریت خطاها و بهبود کارایی اپلیکیشن نیز در کنترلر تعریف شده‌اند.

در متد create کنترلر کوسه، اگر یک نمونه جدیدی از کلاس Shark با موفقیت ذخیره شود، متد redirect_to درخواست جدیدی را برای شما ایجاد می‌کند که تمامی آن‌ها را به متد show هدایت می‌کند.

این درخواست از نوع GET است و متد show داده‌هایی که به تازگی وارد شده‌اند را به کاربر نشان می‌دهد.

اگر ذخیره‌سازی شما ناموفق باشد، Rails به جای ارسال درخواست جدید به سرور، دوباره قالب app/views/sharks/new.html.erb را رندر می‌کند و به کاربر این فرصت را می‌دهد که اطلاعات خود را دوباره در این قسمت وارد کند.

دستور زیر برای مشاهده قالب ویو Index می‌باشد که به متد Index در کنترلر شما متصل است.

cat app/views/sharks/index.html.erb
<p style="color: green"><%= notice %></p>

<h1>Sharks</h1>

<div id="sharks">
  <% @sharks.each do |shark| %>
    <%= render shark %>
    <p>
      <%= link_to "Show this shark", shark %>
    </p>
  <% end %>
</div>

<%= link_to "New shark", new_shark_path %>

در این ویو، حلقه‌ای وجود دارد که از روی تمام نمونه‌های Shark در پایگاه داده عبور می‌کند و آن‌ها را بررسی می‌کند. این کار با استفاده از ERB templating انجام می‌شود که برای هر نمونه از کوسه، نام و حقایق آن را به کاربر خود نمایش می‌دهد. سپس از متد link_to برای ایجاد لینک‌هایی استفاده می‌شود که کاربر را به صفحه جزئیات هر کوسه هدایت می‌کند. این صفحه، به متد show در کنترلر آن متصل است.

این لینک‌ها به کاربران اجازه می‌دهد تا بتوانند اطلاعات دقیق‌تر هر کوسه را به راحتی مشاهده کنند.

این دستور برای مشاهده قالب ویو new است که می‌تواند فرم جدیدی را برای اضافه کردن کوسه به دیتابیس ایجاد کند.

cat app/views/sharks/new.html.erb
<h1>New shark</h1>

<%= render "form", shark: @shark %>

<br>

<div>
  <%= link_to "Back to sharks", sharks_path %>
</div>

اگرچه این قالب فیلدهای ورودی برای اضافه کردن کوسه جدید ندارد، اما با استفاده از دستور render "form" مشخص می‌شود که این قالب، پارشال _form.html.erb را بارگذاری می‌کند. این پارشال حاوی کدهایی است که در ویوهای مختلف از آن استفاده می‌شود و به این معناست که از تکرار کد جلوگیری می‌شود و فرم‌ها ساده‌تر و مدیریت آن‌ها راحت‌تر می‌گردد.

نکته:

  • قالب new.html.erb فرم ساخت کوسه جدید را از پارشال _form.html.erb بارگذاری می‌کند.
  • متد create در کنترلر برای ذخیره اطلاعات جدید استفاده می‌شود و در صورت موفقیت، کاربر را به صفحه show هدایت می‌کند.
  • قالب index.html.erb لیستی از تمام کوسه‌ها را برای شما به نمایش می‌گذارد.

برای ایجاد یک نمونه جدید از کوسه، می‌توانید فایل _form.html.erb را بررسی کنید.

دستور زیر فایل پارشال فرم را بررسی می‌کند.

cat app/views/sharks/_form.html.erb
<%= form_with(model: shark) do |form| %>
  <% if shark.errors.any? %>
    <div style="color: red">
      <h2><%= pluralize(shark.errors.count, "error") %> prohibited this shark from being saved:</h2>

      <ul>
        <% shark.errors.each do |error| %>
          <li><%= error.full_message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div>
    <%= form.label :name, style: "display: block" %>
    <%= form.text_field :name %>
  </div>

  <div>
    <%= form.label :facts, style: "display: block" %>
    <%= form.text_area :facts %>
  </div>

  <div>
    <%= form.submit %>
  </div>
<% end %>

این قالب از form_with که برای ساخت فرم‌های ورودی طراحی شده است استفاده می‌کند. در این قسمت form_with(model: shark) یک شیء فرم جدیدی را ایجاد می‌کند که فیلدهای آن به ستون‌های جدول کوسه در پایگاه داده متصل است. به این ترتیب، کاربران می‌توانند اطلاعات مربوط به نام و اطلاعاتی راجب کوسه را وارد کرده و در پایگاه داده ذخیره کنند.

اگر در هنگام ارسال فرم خطاهایی وجود داشته باشد، در بالای فرم به رنگ قرمز نمایش داده خواهند شد.

هنگامی که این فرم ارسال می‌شود، یک پاسخ JSON با داده‌های وارد شده به وجود می‌آید که بقیه بخش‌های برنامه می‌توانند از طریق متد params به آن دسترسی پیدا کنند.

مرحله چهارم: ایجاد صفحه اصلی اپلیکیشن و تست عملکرد

برای اینکه صفحه فرود (landing page) اپلیکیشن شما به‌صورت مستقیم به هدف اپلیکیشن اشاره کند، می‌توانید صفحه اصلی اپلیکیشن را به روت اپلیکیشن اختصاص دهید. این کار به کاربران این امکان را می‌دهد که از همان ابتدا با هدف و محتوای اپلیکیشن آشنا شوند و تجربه بهتری در استفاده از آن داشته باشند.

برای مثال، می‌توانید یک کنترلر به نام Welcome را بسازید و یک ویو به نام index را برای آن اضافه کنید.این ویو به کاربران صفحه فرود عمومی نمایش می‌دهد که می‌تواند به بخش‌های مختلف اپلیکیشن لینک دهد و آن‌ها را به قسمت‌های مختلف هدایت کند تا تجربه کاربری بهتری ایجاد شود.

برای انجام این عمل، باید مسیرهای اپلیکیشن را در فایل config/routes.rb تغییر دهید تا روت اپلیکیشن را مشخص کنید.

تغییر فایل routes.rb

ابتدا فایل config/routes.rb را برای ویرایش باز کنید:

nano config/routes.rb

سپس، در فایل config/routes.rb این کد را مشاهده خواهید کرد.

Rails.application.routes.draw do
  resources :sharks
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"
end

تغییر روت اپلیکیشن به صفحه index

برای اینکه صفحه روت اپلیکیشن به ویو index کنترلر sharks منتقل شود، باید خط #root "articles#index" را از حالت کامنت خارج کرده و کلمه articles را با sharks جایگزین کنید.

Rails.application.routes.draw do
  resources :sharks

  root 'sharks#index' 
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

پس از ویرایش فایل‌ها، آن را ذخیره کرده و از ویرایشگر خارج شوید. اگر از nano استفاده می‌کنید، برای خروج، ابتدا CTRL+X سپس Y و در نهایت ENTER را فشار دهید.

دستورات مهم

زمانی که کاربران به روت اپلیکیشن شما وارد شدند، به جای صفحه خوش‌آمد گویی رایلی، باید به صفحه فرود کوسه‌ها هدایت شوند. در این صفحه کاربران می‌توانند اطلاعات جدیدی از کوسه‌ها را وارد کرده و اطلاعاتی که در آن وجود دارد را مشاهده، ویرایش یا حذف کنند.

برای اعمال تغییرات در پایگاه داده، دستور زیر را اجرا کنید.

rails db:migrate

در صورتی که این دستورات به درستی اجرا شوند، خروجی زیر را برای شما نمایش خواهد داد.

== 20230124215633 CreateSharks: migrating =====================================
-- create_table(:sharks)
   -> 0.0041s
== 20230124215633 CreateSharks: migrated (0.0045s) ============================

👈🏻بیشتر بخوانید: راهنمای عیب‌یابی مشکلات رایج سایت در سرور مجازی لینوکس

مرحله پنجم: ایجاد نمای روت اپلیکیشن و تست عملکرد

صفحه ابتدایی اپلیکیشن شما باید به روت اپلیکیشن متصل باشد تا کاربران بلافاصله با ورود به اپلیکیشن، هدف و محتوای آن را درک کنند.

برای مثال، می‌توانید یک کنترلر Welcome و نمای index مرتبطی بسازید که یک صفحه ابتدایی عمومی برای کاربران فراهم کند و همچنین لینک‌هایی به بخش‌های مختلف اپلیکیشن را ایجاد کند.

برای انجام این کار، باید تنظیمات روتینگ را در فایل config/routes.rb تغییر دهید تا روت اپلیکیشن مشخص شود.

برای ویرایش فایل config/routes.rb، از ویرایشگر مورد نظر خود (مثل nano) استفاده کنید.

nano config/routes.rb

سپس در فایل routes.rb، روت‌های خود را مانند زیر دستی تنظیم کنید.

Rails.application.routes.draw do
  resources :sharks
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"
end

اگر روت خاصی را تنظیم نکرده باشید، وقتی آدرس http://localhost:3000 یا http://your_server_ip:3000 را وارد می‌کنید، به‌صورت پیش فرض صفحه خوش آمدگویی Rails نمایش داده می‌شود.

برای اینکه صفحه روت اپلیکیشن به نمای index کنترلر sharks متصل شود، باید خط پیش‌فرض root "articles#index" را باز کرده و articles را به sharks تغییر دهید.

Rails.application.routes.draw do
  resources :sharks

  root 'sharks#index' 
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

پس از ذخیره تغییرات، از ویرایشگر خارج شوید. اگر از ویرایشگر nano استفاده کردید، برای خروج CTRL+X، سپس Y و بعد ENTER را فشار دهید.

وقتی کاربران به روت اپلیکیشن شما می‌روند. ‌به‌جای صفحه پیش‌فرض خوش‌آمد‌گویی Rails، مستقیما به صفحه اصلی Sharks هدایت می‌شوند. در این صفحه، کاربران می‌توانند کوسه‌های جدیدی را اضافه کنند و لیست کوسه‌های موجود را مشاهده، ویرایش یا حذف کنند.

مرحله ششم: اجرای مایگریشن‌ها

برای اینکه تغییرات در پایگاه داده اعمال شود، دستور زیر را وارد کنید.

rails db:migrate

خروجی زیر تأیید می‌کند که مایگریشن شما انجام شده است یا خیر.

== 20230124215633 CreateSharks: migrating =====================================
-- create_table(:sharks)
   -> 0.0041s
== 20230124215633 CreateSharks: migrated (0.0045s) ============================

در این قسمت باید سرور Rails خود را دوباره راه‌اندازی کنید. اگر روی سیستم خودکار می‌کنید، دستور زیر را وارد کنید.

rails s

در صورتی که بر روی سرور توسعه‌دهنده کار می‌کنید، از دستور زیر استفاده کنید.

rails s --binding=your_server_ip

نکته:

  • اگر بر روی سیستم خود هستید، به آدرس localhost:3000 بروید.
  • اگر بر روی سرور توسعه‌دهنده کار می‌کنید، آدرس http://your_server_ip:3000 را وارد کنید.
  • حالا می‌توانید صفحه ابتدایی جدید اپلیکیشن خود را مشاهده کنید.

برای ایجاد یک کوسه جدید، روی لینک New Shark کلیک کنید. این لینک شما را به مسیر sharks/new هدایت می‌کند.

برای تست اپلیکیشن، می‌توانید اطلاعاتی را وارد کنید. در فیلد Name عبارت Great White را وارد کنید و در فیلد Facts عبارت Scary را بنویسید.

بعد از وارد کردن اطلاعات، روی دکمه Create Shark کلیک کنید تا کوسه جدید برای شما ساخته شود.

این دکمه شما را به روت show هدایت می‌کند، که با استفاده از فیلتر before_action، متد set_shark اجرا می‌شود. این متد id کوسه‌ای که ایجاد کرده‌اید را دریافت می‌کند.

# ~/sharkapp/app/controllers/sharks_controller.rb

class SharksController < ApplicationController
  before_action :set_shark, only: %i[ show edit update destroy ]

  . . . 
  # GET /sharks/1 or /sharks/1.json
  def show
  end
  . . . 

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

در این کد، متد set_shark از before_action استفاده می‌کند تا قبل از هر عملی مانند show , edit , update یا destroy id کوسه را پیدا کرده و در متغیر @shark ذخیره کند. این کار باعث می‌شود که در صفحه show اطلاعات مربوط به کوسه که ساخته‌اید، به‌صورت کامل نمایش داده شود.

برای تست ویرایش، روی گزینه Edit this shark در ورودی خود کلیک کنید. این کار شما را به روت edit برای همان کوسه می‌برد.

حالا که عملکرد‌های پایه‌ای برنامه‌تان را تست کرده‌اید می‌توانید اعتبار سنجی‌ها و چک‌های امنیتی را به برنامه خود اضافه کنید تا همه چیز برای شما راحت‌تر شود.

برنامه‌ی شما می‌تواند ورودی‌های کاربران را بپذیرد، اما امکان دارد که کاربری بخواهد بدون اینکه فیلد توضیحات (Facts) را پر کند یک کوسه جدید بسازد یا برای کوسه‌ای که قبلاً در پایگاه داده وجود داشته است، ورودی جدیدی را وارد کند. برای جلوگیری از این اشتباهات، می‌توانید قوانین اعتبارسنجی را به برنامه اضافه کنید تا قبل از ذخیره‌سازی داده‌ها در پایگاه داده انجام شود، بتواند بررسی‌های لازم را انجام دهد.

برای این کار، به مدل کوسه‌ی خود بروید و اعتبارسنجی‌ها را اضافه کنید.

ابتدا فایل مدل shark.rb را باز کنید.

bashCopyEditnano app/models/shark.rb

کلاس Shark از ApplicationRecord ارث می‌برد و کلاس ApplicationRecord هم از ActiveRecord::Base ارث بری می‌کند. این یعنی کلاس Shark می‌تواند از امکانات مربوط به پایگاه داده استفاده کند.

rubyCopyEditclass Shark < ApplicationRecord
end

برای اینکه مطمئن شوید فیلد name پر شده است و ورودی‌های شما تکراری نیستند، می‌توانید اعتبار سنجی‌های را اضافه کنید.

rubyCopyEditclass Shark < ApplicationRecord
  validates :name, presence: true, uniqueness: true
end

سپس یک اعتبارسنجی برای فیلد facts اضافه کنید تا مطمئن شوید این فیلد هم مانند بقیه فیلد‌ها پر شده است.

rubyCopyEditclass Shark < ApplicationRecord
  validates :name, presence: true, uniqueness: true
  validates :facts, presence: true
end

در این قسمت، خط validates :facts , presence: true فقط بررسی می‌کند که فیلد facts پر هست یا خیر، اما به یاد داشته باشید که تکراری بودن اطلاعات در این فیلد بررسی نمی‌شود.

پس از اعمال تغییرات، فایل را ذخیره کرده و آن را ببندید.

حال سرور را دوباره راه‌اندازی کنید و با دستور rails s یا rails s --binding=your_server_ip، به روت برنامه خود بروید.

برای ساخت کوسه جدید، بر روی لینک New Shark کلیک کنید. بعد از آن فرم را باز کنید، در فیلد Name عبارت Great White، در فیلد Facts عبارت Big Teeth را وارد کنید. در انتها بر روی دکمه Create Shark کلیک کنید. اگر همه‌چیز درست باشد، پیام موفقیت آمیز بودن ساخت کوسه جدید برای شما نمایش داده‌می‌شود.

برای بررسی اعتبار سنجی‌های بیشتر، باید بر روی لینک Backti sharks کلیک کنید تا بتوانید به صفحه اصلی برگردید. بعد از آن دوباره بر روی New Shark کلیک کنید. در فرم جدید، و در فیلد Name عبارت Tiger Shark را وارد کنید و فیلد Facts را همان طور خالی بگذارید. حالا وقتی بر روی دکمه Create Shark کلیک می‌کنید پیامی بر اجباری بودن این فیلد به شما نمایش داده می‌شود.

مرحله هفتم: افزودن احراز هویت

با اعمال اعتبارسنجی‌ها، دیگر مطمئن هستید که داده‌هایی در دیتابیس ذخیره می‌شوند معتبر هستند. اگر نمی‌خواهید هر کسی به دیتابیس دسترسی داشته باشد، باید تدابیری را برای احراز هویت کاربران خود بسیازید، تا فقط کاربران مجاز بتوانند کوسه‌ها را به آن اضافه کنند. برای این کار از متد http_basic_authenticate_with استفاده می‌کنیم که به کاربران اجازه ایجاد نام کاربری و کلمه عبور را می‌دهد.

روش‌های مختلفی برای احراز هویت در Rails وجود دارد، که می‌توان به استفاده از جواهرات bcrypt یا devise از آن نام برد. برای شروع این کار، باید در کنترلر اصلی اپلیکیشن خود روشی اضافه کنید که در تمام اکشن‌های اپلیکیشن اعمال شود. این کار به خصوص زمانی کاربرد دارد که کنترلرهای جدیدی به اپلیکیشن اضافه کنید.

برای این کار ابتدا سرور را با فشردن CTRL+C متوقف کنید.

فایل کنترلر اپلیکیشن را باز کنید.

nano app/controllers/application_controller.rb

در این فایل کلاس ApplicationController تعریف شده که سایر کنترلرها از آن ارث‌بری می‌کنند.

class ApplicationController < ActionController::Base
end

برای احراز هویت، از نام کاربری و کلمه عبور پیچیده و سخت استفاده کنید و متد http_basic_authenticate_with را به فایل‌هایتان اضافه کنید.

class ApplicationController < ActionController::Base
  http_basic_authenticate_with name: 'sammy', password: 'shark', except: [:index, :show]
end

با اضافه کردن این کد، کاربران بدون نیاز به ورود حساب کاربری می‌توانند صفحات Index و Show را مشاهده کنند. یعنی که می‌توانند اطلاعات مربوط به کوسه ها را ببینند و آن را مطالعه کنند. اما برای ویرایش محتوا، به احراز هویت نیاز خواهند داشت.

بعد از ویرایش، فایل را ذخیره کرده و ببندید.

حالا سرور را با دستور rails s یا rails s --binding=your_server_ip راه‌اندازی کنید و به اپلیکیشن خود در آدرس http://localhost:3000 یا http://your_server_ip:3000 بروید.

در صفحه اصلی روی دکمه New Shark کلیک کنید. این کار پنجره احراز هویت زیر را نمایش خواهد داد.

اگر نام کاربری sammy و کلمه عبور shark را وارد کنید، که همان ترکیب مورد نظر شما در فایل app/controllers/application_controller.rb است، می‌توانید یک کوسه جدید ایجاد کنید.

حالا شما یک اپلیکیشن کوسه کاربردی دارید که شامل اعتبارسنجی داده‌ها و یک سیستم احراز هویت ساده است.

جمع بندی

Rails یک فریم‌ورک ساده و قدرتمند است که برای ساخت اپلیکیشن‌های وب از آن استفاده می‌شود. این فریم‌ورک به شما کمک می‌کند تا به راحتی برنامه خود را بسازید. در این آموزش، آموختید که چگونه یک اپلیکیشنی بسازید که به کاربران خود امکان نوشتن اطلاعات را بدهد و بتوانند آن‌ها را به اشتراک بگذارند. تمامی این مراحل به شما کمک می‌کند تا به سرعت یک اپلیکیشن کاربردی بسازید و تجربه‌ای ساده و سریع از توسعه وب داشته باشید.