en
Feedback
ToCode

ToCode

Open in Telegram

讟讬驻讬诐 拽爪专讬诐 诇诪转讻谞转讬诐 诪讗转 讬谞讜谉 驻专拽

Show more
1 419
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
ToCode
1 419
 => false
讛讚专讱 诇讛转诪讜讚讚 注诐 诪住驻专 诪拽讜专讜转 注讚讻讜谉 讘专讬讬诇住 讛讬讗 诇讬讬爪专 诪住驻专 Validation Contexts. 讻诇 Validation Context 诪讬讬爪讙 讗转 讛讟讜驻住 讗讜 讛诪住讱 讘讜 讗谞讞谞讜 专讜爪讬诐 诇注讚讻谉 讗转 讛讛讜讚注讛 讘爪讜专讛 诪住讜讬诪转, 讜讛讜讜诇讬讚爪讬讜转 砖讘讜 讬转讗讬诪讜 诇讗驻砖专讜讬讜转 讘讗讜转讜 讛诪住讱. 讘讞讝专讛 诇讛讜讚注讛 讗驻砖专 诇注讚讻谉 讗转 讛拽讜讚 讘爪讜专讛 讛讘讗讛:
class Message < ApplicationRecord
  validates :from, presence: true, on: :message_form
  validates :to, presence: true, on: :message_form
  validates :title, length: { minimum: 5 }, on: :message_form
  validates :body, presence: true, on: :message_form
end
讘注转 砖诪讬专转 讛讜讚注讛 讗谞讞谞讜 谞注讘讬专 注讻砖讬讜 讗转 讛拽讜谞讟拽住讟 讛诪转讗讬诐 讻讚讬 砖专讬讬诇住 讬讚注 讗讬讝讛 讜讜诇讬讚爪讬讜转 诇讛驻注讬诇:
m = Message.first
m.important = true
m.save(context: :message_index)
 => true
讻专讙注 驻讜谞拽爪讬讬转 update 砖诇 专讬讬诇住 诇讗 讬讜讚注转 诇注讘讜讚 注诐 Custom Validation Context 讜诇讻谉 讻讚讬 诇注讘讜讚 讗讬转诐 讘讚专讱 讻诇诇 谞专爪讛 诇讛讜住讬祝 驻讜谞拽爪讬讛 诪砖诇谞讜 诇讻诇 讛 Active Records 讘讬讬砖讜诐:
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  def update_attibutes_with_context(attributes, *contexts)
    with_transaction_returning_status do
      assign_attributes(attributes)
      save(context: contexts)
    end
  end
end
讜诇住讬讜诐 讘 Controller 谞爪讟专讱 诇讛讜住讬祝 讗转 讛 Context 讛诪转讗讬诐 讘讻诇 驻注讜诇讛:
class MessagesController < ApplicationController
  before_action :set_message, only: [:show, :edit, :update, :destroy, :toggle_important]

  # GET /messages
  # GET /messages.json
  def index
    @messages = Message.all
  end

  # GET /messages/1
  # GET /messages/1.json
  def show
  end

  # GET /messages/new
  def new
    @message = Message.new
  end

  # GET /messages/1/edit
  def edit
  end

  def toggle_important
    @message.important = !@message.important
    @message.save(context: :messages_index)
  end

  # POST /messages
  # POST /messages.json
  def create
    @message = Message.new(message_params)

    respond_to do |format|
      if @message.save(context: :message_form)
        format.html { redirect_to @message, notice: 'Message was successfully created.' }
        format.json { render :show, status: :created, location: @message }
      else
        format.html { render :new }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /messages/1
  # PATCH/PUT /messages/1.json
  def update
    respond_to do |format|
      if @message.update_attributes_with_context(message_params, :message_form)
        format.html { redirect_to @message, notice: 'Message was successfully updated.' }
        format.json { render :show, status: :ok, location: @message }
      else
        format.html { render :edit }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /messages/1
  # DELETE /messages/1.json
  def destroy
    @message.destroy
    respond_to do |format|
      format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

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

    # Only allow a list of trusted parameters through.
    def message_params
      params.require(:message).permit(:from, :to, :title, :body)
    end
end
## 讗驻砖专 诇讬爪讜专 讜讜诇讬讚爪讬讛 讻诇诇讬转 (诇诪专讜转 砖讝讛 诪讘诇讘诇 讗转 讛诪砖转诪砖讬诐) 专讬讬诇住 诪讗驻砖专 诇谞讜 诇讬爪讜专 讜讜诇讬讚爪讬讛 "讻诇诇讬转" 注诇 讗讜讘讬拽讟 砖讛转讜爪讗讛 砖诇讛 转讜爪讙 讘专砖讬诪转 讛讜讚注讜转 讛砖讙讬讗讛 砖诇 讛讟讜驻住 讗讘诇 诇讗 注讘讜专 砖讚讛 诪住讜讬诐. 讻诪注讟 转诪讬讚 讻砖讗转诐 讘讗讬诐 诇讻转讜讘 讜讜诇讬讚爪讬讛 讻诇诇讬转 讻讝讜 砖讜讜讛 诇讛砖拽讬注 注讜讚 讻诪讛 讚拽讜转 砖诇 诪讞砖讘讛 讜诇诪爪讜讗 讚专讱 讟讜讘讛 讬讜转专 诇讘讬爪讜注 讛诪砖讬诪讛.

ToCode
1 419
专讬讬诇住 讛讜讗 讗讜诪谞诐 诪讛讬专 讗讘诇 讙诐 砖诇讬讞转 讛讜讚注讛 诇砖专转 讛诪讛讬专 讘注讜诇诐 转讬拽讞 讬讜转专 讝诪谉 诪讜讜诇讬讚爪讬讛 砖专爪讛 讗爪诇 讛诇拽讜讞 讘诇讬 诇讚讘专 注诐 讛砖专转. 讻诪注讟 转诪讬讚 讘讻诇 诪拽讜诐 砖讬砖 讜讜诇讬讚爪讬讛 讘 Active Record 讻讚讗讬 诇讛讜住讬祝 讙诐 讜讜诇讬讚爪讬讛 诪拽讘讬诇讛 讘讟讜驻住 (讗谞讬 讗讜诪专 讻诪注讟 讻讬 讝讛 诇讗 转诪讬讚 讗驻砖专讬 - 诇讚讜讙诪讛 讜讬讚讜讗 砖注专讱 诪住讜讬诐 讛讜讗 讬讬讞讜讚讬 讘诪注专讻转 讝讛 诪砖讛讜 砖讗驻砖专 诇注砖讜转 专拽 讘爪讚 砖专转). 讘讚讜讙诪讛 砖诇谞讜 讗谞讬 讬讻讜诇 诇注讚讻谉 讗转 讛讟讜驻住 注诐 讛拽讜讚 讛讘讗 讜讻讱 诇讛专讜讜讬讞 讙诐 讜讜诇讬讚爪讬讛 诇驻谞讬 砖诇讬讞转 讛讛讜讚注讛 诇砖专转 (讻讚讬 诇拽讘诇 讞讜讜讬转 诪砖转诪砖 讟讜讘讛 讬讜转专), 讜讙诐 讜讜诇讬讚爪讬讛 讘爪讚 讛砖专转 (讘砖讘讬诇 讗讘讟讞转 诪讬讚注 讜讘砖讘讬诇 驻专讟讬诐 砖讛诇拽讜讞 诇讗 讬讜讚注 注讚讬讬谉):
<%= form_with(model: message, local: true) do |form| %>
  <% if message.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(message.errors.count, "error") %> prohibited this message from being saved:</h2>

      <ul>
        <% message.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :from %>
    <%= form.text_field :from, required: true %>
  </div>

  <div class="field">
    <%= form.label :to %>
    <%= form.text_field :to, required: true %>
  </div>

  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title, required: true, minlength: 6 %>
  </div>

  <div class="field">
    <%= form.label :body %>
    <%= form.text_area :body, required: true %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

住驻专讬讛 讘砖诐 client_side_validations 诪转专讙诪转 讘爪讜专讛 讗讜讟讜诪讟讬转 讗转 讛 Active Record Validations 诇讜讜诇讬讚爪讬讜转 讘爪讚 诇拽讜讞 讘讗诪爪注讜转 JavaScript 讜诇驻注诪讬诐 讻讚讗讬 诇讛砖转诪砖 讘讛. ## 讜讜诇讬讚爪讬讛 讗讬谞讛 讗讬谞讚拽住 专注讬讜谉 砖谞讬 砖讞砖讜讘 诇讝讻讜专 讛讜讗 砖讛诪讟专讛 砖诇 讜讜诇讬讚爪讬讛 讛讬讗 诇讛爪讬讙 讛讜讚注转 砖讙讬讗讛 讬驻讛 诇诪砖转诪砖 讻砖讗讜转讜 诪砖转诪砖 诪谞住讛 诇讛拽诇讬讚 谞转讜谞讬诐 诇讗 谞讻讜谞讬诐 讘讟讜驻住. 讜讜诇讬讚爪讬讛 讘 Active Record 诇讗 转诪谞注 诪讛诪注专讻转 砖诇讻诐 诇砖诪讜专 诪讬讚注 砖讙讜讬 讗讜 砖诇讗 注讜讘专 讜讜诇讬讚爪讬讛 讜讬砖 讛诪讜谉 讚专讻讬诐 诇砖诪讜专 诪讬讚注 讜诇讚诇讙 注诇 讛讜讜诇讬讚爪讬讛. 讗诐 讞砖讜讘 诇讻诐 砖诪讬讚注 "诇讗 谞讻讜谉" 诇讗 讬讬讻谞住 诇讘住讬住 讛谞转讜谞讬诐 讛讚专讱 讛讬讞讬讚讛 诇讛讘讟讬讞 讗转 讝讛 讛讬讗 诇讬爪讜专 讗讬谞讚拽住 讗讜 Constraint 讘讘住讬住 讛谞转讜谞讬诐 注爪诪讜. 谞砖讬诐 诇讘 砖讘住讬住讬 谞转讜谞讬诐 诇讗 讬讜讚注讬诐 诇注砖讜转 讻诇 诪讛 砖讛砖专转 砖诇谞讜 讬讜讚注 诇注砖讜转, 讜讘专讜讘诐 讗讬谉 讚专讱 拽诇讛 诇讛讙讚讬专 诇讚讜讙诪讛 讗讜专讱 诪讬谞讬诪诇讬 诇诪讞专讜讝转 讘注诪讜讚讛. 讝讛 讗讜诪专 砖讘讛讞诇讟 讬讛讬讜 诪爪讘讬诐 讘讛诐 转讛讬讛 诇讻诐 讜讜诇讬讚爪讬讛 讗讘诇 讞诇拽 诪讛诪讬讚注 讘讘住讬住 讛谞转讜谞讬诐 诇讗 讬注讘讜专 讗讜转讛. 讘诪爪讘 讻讝讛 诪砖转诪砖 讬爪讟专讱 诇注讚讻谉 注专讻讬诐 讘讟讜驻住 讙诐 讗诐 讛讜讗 诇讗 砖讬谞讛 讗讜转诐 专拽 讘砖讘讬诇 诇砖诪讜专 讗转 讛诪讬讚注. 讘讚讜讙诪讛 砖诇谞讜, 讗谞讬 讬讻讜诇 诇讬爪讜专 诪转讜讱 Rails Console 讗讜讘讬拽讟 讛讜讚注讛 转讜讱 讚讬诇讜讙 注诇 讛讜讜诇讬讚爪讬讛:
m=Message.new(to: 'ynon')
m.save(validate: false)
讘讗驻诇讬拽爪讬讛 注爪诪讛 讗谞讬 讗专讗讛 讗转 讛讛讜讚注讛 讛讝讜 讘专砖讬诪转 讛讛讜讚注讜转 讜讗讜讻诇 诇讛讬讻谞住 诇讟讜驻住 注专讬讻讛 讻讚讬 诇注讚讻谉 讗讜转讛, 讗讘诇 讘转讜讱 讗讜转讜 讟讜驻住 讗谞讬 讗讛讬讛 讞讬讬讘 诇注讚讻谉 讗转 讛砖讚讜转 from, title 讜 body 讻讚讬 砖讗讜讻诇 诇砖诪讜专. ## 讛讬讜 讝讛讬专讬诐 讻砖讗转诐 诪讜住讬驻讬诐 讜讜诇讬讚爪讬讛 讞讚砖讛 诇诪讜讚诇 讗讬谉 讘注讬讛 诇讛讜住讬祝 讜讜诇讬讚爪讬讛 诇诪讜讚诇 砖讬砖 讘讜 讻讘专 谞转讜谞讬诐 (诇诪砖诇 诪讙讬专住讛 拽讜讚诪转 砖诇 讛讗驻诇讬拽爪讬讛) 讗讘诇 注诇讬讻诐 诇讛讬讜转 讝讛讬专讬诐 讜讗祝 驻注诐 诇讗 诇讛谞讬讞 砖讻诇 讛讜讜诇讬讚爪讬讜转 注讜讘专讜转 注诇 谞转讜谞讬诐 拽讬讬诪讬诐. 讻诇 讛讜住驻讛 砖诇 讜讜诇讬讚爪讬讛 爪专讬讻讛 诇讛转讞讬诇 诪诪讞砖讘讛 注诇 讟讜驻住 讜注诇 讛讜讚注讛 砖诪砖转诪砖 讬专讗讛 讻砖讛讜讗 诪诪诇讗 讗转 讛讟讜驻住. 讗诐 诪讜住讬驻讬诐 讜讜诇讬讚爪讬讛 注诇 谞转讜谞讬诐 拽讬讬诪讬诐 讬砖 诇讜讜讚讗 砖诪砖转诪砖 讬讻讜诇 诇驻转讜讞 讗转 讛讗讜讘讬拽讟 讘诪爪讘 注专讬讻讛 讜诇讛讜住讬祝 讗转 讛注专讻讬诐 讛讞住专讬诐 讻讚讬 诇注讘讜专 讜讜诇讬讚爪讬讛 (讗讞专转 讗讬 讗驻砖专 讬讛讬讛 诇砖诪讜专 讗讜 诇注讚讻谉 讗驻讬诇讜 砖讚讜转 讗讞专讬诐). ## 讗驻砖专 诇讛讙讘讬诇 讜讜诇讬讚爪讬讛 诇 Context 诪住讜讬诐 讛诪爪讘 讛讝讛 砖诇 讜讜诇讬讚爪讬讜转 讞讚砖讜转 讛讜驻讱 诪讘诇讘诇 讘诪讬讜讞讚 讻砖讬砖 诪住驻专 讚专讻讬诐 诇注讚讻谉 讗讜讘讬拽讟 讘诪注专讻转. 诇讚讜讙诪讛 讘诪注专讻转 讛讛讜讚注讜转 砖诇谞讜 讗驻砖专 诇讚诪讬讬谉 砖诇讻诇 讛讜讚注讛 讬讛讬讛 讻驻转讜专 注诐 讗讬讬拽讜谉 砖诇 讻讜讻讘 讘诪住讱 专砖讬诪转 讛讛讜讚注讜转 砖讬住诪谉 讗讜转讛 讘转讜专 讛讜讚注讛 "讞砖讜讘讛". 注讻砖讬讜 讬砖 诇谞讜 2 讚专讻讬诐 诇注讚讻谉 讻诇 讛讜讚注讛: 1. 讟讜驻住 讛注讚讻讜谉 讛专讙讬诇 砖诇 讛讜讚注讛 2. 诇讞讬爪讛 注诇 讻驻转讜专 "讻讜讻讘" 砖诪注讚讻谞转 专拽 讗转 砖讚讛 "important" 讘讛讜讚注讛, 砖讚讛 讞讚砖 砖讬爪专谞讜 讘砖讘讬诇 讛驻讬爪'专. 讗诐 讘讗诪转 谞诇讱 诇讘谞讜转 讗转 驻讬爪'专 讛讻讜讻讘讬诐 谞讙诇讛 砖讗谞讞谞讜 诇讗 讬讻讜诇讬诐 诇住诪谉 讘转讜专 "讞砖讜讘" 讗转 讛讛讜讚注讛 讛诇讗 讜讜诇讬讚讬转 砖讬爪专谞讜 讘住注讬祝 讛拽讜讚诐. 专讬讬诇住 讬讬讻砖诇 讘讟注谞讛 砖讛讜讗 诇讗 讬讻讜诇 诇注讚讻谉 讗转 讛讗讜讘讬拽讟 讻讬 讛讗讜讘讬拽讟 谞讻砖诇 讘讜讜诇讬讚爪讬讛, 诇诪专讜转 砖讗谞讞谞讜 注讜讘讚讬诐 诪转讜讱 诪诪砖拽 讗讞专 讘讜 讗讬 讗驻砖专 诇砖谞讜转 讗转 讛砖讚讜转 砖诇讗 注讘专讜 讜讜诇讬讚爪讬讛. 讗驻砖专 诇专讗讜转 讗转 讝讛 讗诐 谞专讬抓 讗转 讛拽讜讚 讛讘讗 诪转讜讱 讛拽讜谞住讜诇:
m = Message.first
m.important = true
m.save

ToCode
1 419
# 讟讬驻讬诐 诇砖讬诪讜砖 讟讜讘 讬讜转专 讘 Active Record Validations 讗讞讚 讛专注讬讜谞讜转 讛讬驻讬诐 讘专讬讬诇住, 讜讗讞讚 讛专注讬讜谞讜转 砖诇拽讞 诇讬 讛讻讬 讛专讘讛 讝诪谉 诇讛讘讬谉, 讛讜讗 讛 Active Record Validations. 讛住讬驻讜专 讘拽爪专讛 讛讜讗 砖诇驻注诪讬诐 讬砖 诇谞讜 讘讗驻诇讬拽爪讬讛 讟驻住讬诐 砖诪讟专转诐 诇讬爪讜专 讗讜 诇注讚讻谉 诪讬讚注 讘讘住讬住 讛谞转讜谞讬诐. 讛诪讬讚注 讘讘住讬住 讛谞转讜谞讬诐 讘专讬讬诇住 诪讬讜爪讙 注诇 讬讚讬 拽诇讗住 砖谞拽专讗 Active Record, 讜诇讻谉 讻砖爪专讬讱 诇注砖讜转 讜讜诇讬讚爪讬讛 注诇 讛诪讬讚注 讘讟驻住讬诐 讗讜转诐 Active Records 讬讛讬讜 讛诪拽讜诐 讛讗讬讚讗诇讬. 讘驻讜住讟 讝讛 讗专讗讛 讘拽爪专讛 讗讬讱 诇讛砖转诪砖 讘 Active Record Validations 讘讬讬砖讜诐 讜诇讗讞专 诪讻谉 讗诪砖讬讱 诇诪住驻专 讟讬驻讬诐 诇砖讬诪讜砖 谞讻讜谉 讘讛诐. ## 讗讬讱 讝讛 注讜讘讚 讘 Rails 讻诇 讟讘诇讛 讘讘住讬住 讛谞转讜谞讬诐 诪讬讜爪讙转 注诇 讬讚讬 诪讞诇拽讛 砖讬讜专砖转 诪 Active Record, 讜讻诇 讗讜讘讬拽讟 诪诪讞诇拽讛 讝讜 诪讬讬爪讙 砖讜专讛 讘讟讘诇讛. 讘讛讙讚专转 讛诪讞诇拽讛 讗谞讞谞讜 诇讗 爪专讬讻讬诐 诇讛讙讚讬专 讗转 讛注诪讜讚讜转 (专讬讬诇住 诪讝讛讛 讗讜转谉 讗讜讟讜诪讟讬转). 讛拽讜讚 讛讘讗 注砖讜讬 诇讛讬讜转 拽讜讚 砖诪讙讚讬专 讗转 讛讞讬讘讜专 讘讬谉 讗驻诇讬拽爪讬讬转 Rails 诇讟讘诇转 讛讛讜讚注讜转:
class Message < ApplicationRecord
end
讘讜讗讜 谞谞讬讞 砖讻诇 讛讜讚注讛 讻讜诇诇转 讗转 讛砖讚讜转 讛讘讗讬诐: 1. 砖诐 讛砖讜诇讞 2. 砖诐 讛谞诪注谉 3. 谞讜砖讗 讛讛讜讚注讛 4. 讙讜祝 讛讛讜讚注讛 5. 转讗专讬讱 讬爪讬专转 讛讛讜讚注讛 6. 转讗专讬讱 注讚讻讜谉 讗讞专讜谉 砖诇 讛讛讜讚注讛 拽讜讚 专讬讬诇住 砖讬讜爪专 讗转 讟讘诇转 讛讛讜讚注讜转 谞专讗讛 讻讱:
  create_table "messages", force: :cascade do |t|
    t.string "from"
    t.string "to"
    t.string "title"
    t.text "body"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end
讻诪讜 砖讛拽讜讚 讻转讜讘 讗讬谉 讜讜诇讬讚爪讬讜转 讻诇诇 注诇 讛砖讚讜转 讘讛讜讚注讛. 讗诐 谞讘谞讛 讟讜驻住 诇讬爪讬专转 讛讜讚注讛 讞讚砖讛, 诪砖转诪砖 讬讜讻诇 诇讛讝讬谉 讻诇 注专讱 讘讟讜驻住 讜讙诐 诇讛砖讗讬专 砖讚讜转 专讬拽讬诐. 讛 Active Record Validation 谞讜注讚 诇转转 讗转 讛转砖转讬转 砖诪讞讘专转 讘讬谉 讜讜诇讬讚爪讬讛 砖诇 讛砖讚讜转 诇讘讬谉 讛讟讜驻住 砖诪砖转诪砖 诪诪诇讗, 讜讝讛 注讜讘讚 讻讱: 1. 诪砖转诪砖 诪讝讬谉 诪讬讚注 讘讟讜驻住 讜讛诪讬讚注 诪讙讬注 诇砖专转 2. 讛砖专转 讬讜爪专 讗讜讘讬拽讟 Message 讜诪诪诇讗 讗讜转讜 讘诪讬讚注 砖讛诪砖转诪砖 讛拽诇讬讚 讘讟讜驻住 3. 讛砖专转 诪驻注讬诇 Validation 注诇 讛讗讜讘讬拽讟 砖谞讜爪专. 讗诐 讛讬讜 砖讙讬讗讜转, 讛转讜爪讗讛 砖诇 讛讜讜诇讬讚爪讬讛 讛讬讗 讛讜住驻转 砖讚讜转 诪讬讚注 诇讗讜讘讬拽讟 讘爪讚 讛砖专转 注诐 讛讜讚注讜转 讛砖讙讬讗讛 讛诪转讗讬诪讜转 诇驻讬 讛砖讚讜转 砖诇 讛讗讜讘讬拽讟. 4. 讛砖专转 讬讜爪专 HTML 讗讜 JSON 诪讗讜讘讬拽讟 讛 Message 砖谞讜爪专 (讝讛 注诐 讛砖讙讬讗讜转) 讜讛讜讚注讜转 讛砖讙讬讗讛 讛诪转讗讬诪讜转 诪讜爪讙讜转 讘讟讜驻住 讗讜 讘转讜讱 讗讜讘讬拽讟 讛 JSON. 诇专讬讬诇住 讬砖 讙诐 转砖转讬转 讚讬 讟讜讘讛 砖诪讞讘专转 讘讬谉 讟讜驻住 诇讘讬谉 讛砖讙讬讗讜转 讻讱 砖讘拽讜讚 讛 ERB 讗谞讞谞讜 爪专讬讻讬诐 讘住讱 讛讻诇 诇讻转讜讘 讗转 讛砖讚讜转 讘讟讜驻住 讘讗讜驻谉 讛讘讗:
<%= form_with(model: message, local: true) do |form| %>
  <% if message.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(message.errors.count, "error") %> prohibited this message from being saved:</h2>

      <ul>
        <% message.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :from %>
    <%= form.text_field :from %>
  </div>

  <div class="field">
    <%= form.label :to %>
    <%= form.text_field :to %>
  </div>

  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>

  <div class="field">
    <%= form.label :body %>
    <%= form.text_area :body %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>
讜讘讗讜驻谉 讗讜讟讜诪讟讬 讛讞诇拽 讛注诇讬讜谉 讬转诪诇讗 讘讛讜讚注讜转 讛砖讙讬讗讛 讛诪转讗讬诪讜转 砖谞诇拽讞讜 讬砖讬专讜转 诪转讜讱 讛 Validation. 讘砖讘讬诇 讛讚讜讙诪讛 讗谞讬 诪讜住讬祝 讘拽讜讚 砖诇 message.rb 讗转 讛转讜讻谉 讛讘讗:
class Message < ApplicationRecord
  validates :from, presence: true
  validates :to, presence: true
  validates :title, length: { minimum: 5 }
  validates :body, presence: true
end
讛诪砖诪注讜转 砖诇 讛讜讜诇讬讚爪讬讛 讛讬讗 砖讘注转 讛讙砖转 讛讟讜驻住 转转讜讜住祝 Server Side Validation 注诇 讛诪讬讚注 讜讛讛讜讚注讛 转讬砖诪专 专拽 讗诐 讻诇 讛砖讚讜转 注讜诪讚讬诐 讘转谞讗讬诐 砖讛讙讚专转讬, 讻诇讜诪专: 1. 拽讬讬诐 注专讱 诇砖讚讛 from 2. 拽讬讬诐 注专讱 诇砖讚讛 to 3. 拽讬讬诐 注专讱 诇砖讚讛 title 讘讗讜专讱 诪讬谞讬诪诇讬 砖诇 5 转讜讜讬诐 4. 拽讬讬诐 注专讱 诇砖讚讛 body 讻诇 讗讞讚 诪讛砖讚讜转 砖诇讗 诪转讗讬诐 诇讜讜诇讬讚爪讬讛 讬讙专讜诐 诇讛爪讙转 讛讜讚注转 砖讙讬讗讛 讘专讗砖 讛讟讜驻住 讜讘谞讜住祝 诇讬爪讬专转 div 讞讚砖 讘转讜讱 讛 div 注诐 讛拽诇讗住 field 砖诇讜 讛拽诇讗住 field_with_errors, 诪讛 砖讬讗驻砖专 诇爪讘讜注 讗转 讛诪拽讜诐 讛专诇讜讜谞讟讬 讘讟讜驻住 讘讗讚讜诐. 讜注讻砖讬讜 砖讗谞讞谞讜 诪讘讬谞讬诐 讗转 讛住讬驻讜专 讛讝讛 讛谞讛 讻诪讛 讚讘专讬诐 砖讞砖讜讘 诇讝讻讜专 诇讙讘讬 讜讜诇讬讚爪讬讜转: ## 讛讜讜诇讬讚爪讬讜转 谞讘讚拽讜转 讘爪讚 砖专转 讜讗讬谞谉 诪讞诇讬驻讜转 Client Side Validations

ToCode
1 419
# 讻诪讛 砖讜讜讛 诇讱 Workflow 讗驻拽讟讬讘讬? 驻注诐 讗讞转 诇驻谞讬 讛专讘讛 讛专讘讛 砖谞讬诐 (谞讜, 砖谞转讬讬诐, 讗讘诇 讝讛 诪专讙讬砖 讛专讘讛) 讬爪专转讬 讻诪讛 拽讬爪讜专讬 讚专讱 住驻爪讬驻讬转 诇讻转讬讘讛 讘讘诇讜讙: 讛转拽谞转 Markdown Mode 讘讗讬诪拽住 讜诇诪讚转讬 讗讬讱 诇讻转讜讘 讗讬转讜 讘注讘专讬转, 讞讬讘专转讬 拽讬爪讜专 诪拽砖讬诐 讻讱 砖讛砖诪讬专讛 转讛讬讛 讬砖讬专讛 诇砖专转 诇转讬拽讬讛 拽讘讜注讛, 注诇 讛砖专转 讻转讘转讬 Cron Job 砖诪讜砖讱 拽讘爪讬 Markdown 诪讗讜转讛 转讬拽讬讛 拽讘讜注讛 讜讛讜驻讱 讗讜转诐 诇驻讜住讟讬诐, 讜讬砖 注讜讚 讻诪讛 转讛诇讬讻讬诐 砖砖讜诇讞讬诐 讻诇 驻讜住讟 讘诪讬讬诇 诇讗谞砖讬诐 砖专讜爪讬诐 诇拽讘诇 讗讜 诇注专讜抓 讟诇讙专诐. 讻诇 注讜讚 讗谞讬 诪拽驻讬讚 诇讛驻注讬诇 讗转 讛讗讬诪拽住 驻注诐 讘讬讜诐 讜诇讻转讜讘, 讻诇 讛砖讗专 拽讜专讛 诪注爪诪讜. 诪爪讚 讛砖谞讬, 讗诐 讬讜诐 讗讞讚 讗谞讬 诇讗 讻讜转讘 讘讝诪谉 讗转 讛驻讜住讟 讛转讛诇讬讻讬诐 诪砖转讙注讬诐 讜讘讟注讜转 讗讬讝讛 讘讜讟 诪驻专住诐 讗转 讛驻讜住讟 诪讗转诪讜诇 驻注诐 砖谞讬讛. 讗诐 讬讜诐 讗讞讚 讗拽讞 讛驻住拽讛 砖诇 讻诪讛 砖讘讜注讜转 讘讻转讬讘讛 讗谞讬 讗爪讟专讱 诇讻讘讜转 讞诇拽 诪讛转讛诇讬讻讬诐 讛讗讜讟讜诪讟讬讬诐. 讗讞专讬 讛讻讬讘讜讬 讻砖讗专爪讛 诇讞讝讜专 诇讻转讜讘 讗爪讟专讱 诇诪爪讜讗 诪讛 讻讬讘讬转讬 讜诇诇诪讜讚 诪讞讚砖 讗讬讱 注讜讘讚讬诐 注诐 讛讚讘专讬诐. 讙诐 讘诪注专讻讜转 转讜讻谞讛 砖讗谞讬 讻讜转讘 讬砖 转讛诇讬讻讬诐 讗讜讟讜诪讟讬讬诐, 讜讙诐 砖诐 讛转讘谞讬转 谞砖讗专转. 讗诐 讛转讛诇讬讱 讛讜讗 诪砖讛讜 砖拽讜专讛 讘转讚讬专讜转 讻诇砖讛讬 拽讘讜注讛 讜爪驻讜讬讛 讛讜讗 讬讬砖讗专 讜讬诪砖讬讱 诇注讘讜讚. 讗诐 讝讛 诪砖讛讜 砖拽讜专讛 驻注诐 讘讛诪讜谉 讝诪谉 讗讜 讘爪讜专讛 诇讗 爪驻讜讬讛 讛讜讗 讚讜专砖 讛专讘讛 讬讜转专 注讘讜讚讛. 讛谞讛 讻诪讛 讚讜讙诪讗讜转: 1. 诇拽讜讞 砖讻诇 讞讜讚砖 注讜砖讛 谞讬住讜讬 砖讬讞讝讜专 诪讙讬讘讜讬 诇讻诇 讛诪注专讻转 讬注砖讛 讗转 讛谞讬住讜讬讬诐 讛讗诇讛 讛专讘讛 讬讜转专 诪讛专 讜讗驻讬诇讜 讘爪讜专讛 讻诪注讟 讗讜讟讜诪讟讬转, 讘讛砖讜讜讗讛 诇诇拽讜讞 砖注讜砖讛 谞讬住讜讬 砖讬讞讝讜专 讻砖讬砖 诇讜 讝诪谉 (讗驻砖专 诇诪砖诇 诇讻转讜讘 住拽专讬驻讟 砖讗讜讟讜诪讟讬转 诪专讬诐 砖专转 讘讗诪讝讜谉, 诪讜砖讱 讗诇讬讜 讗转 讛讙讬讘讜讬 讛讗讞专讜谉, 诪专讬抓 讗转 讻诇 讛讘讚讬拽讜转 讜砖讜诇讞 诪讬讬诇 住讬讻讜诐 讘住讜祝. 住拽专讬驻讟 讻讝讛 讬讻讜诇 诇专讜抓 驻注诐 讘讞讜讚砖 讜讛讻诇 讟讜讘). 2. 诇拽讜讞 砖诪讞讝讬拽 诪注专讻转 CI 砖诪专讬爪讛 讗转 讻诇 讛讘讚讬拽讜转 讻诇 诇讬诇讛 讬专讬抓 讘讚讬拽讜转 讛专讘讛 讬讜转专 讘拽诇讜转 讘讛砖讜讜讗讛 诇讞讘专讛 讘讛 讛诪转讻谞转讬诐 诪专讬爪讬诐 诇注爪诪诐 讗转 讛讘讚讬拽讜转 注诇 讛诪讻讜谞讜转 砖诇讛诐 讻砖讬砖 诇讛诐 讝诪谉. 讘驻注诐 讛专讗砖讜谞讛 砖讘讚讬拽讜转 谞讻砖诇讜转 诇诪砖诇 讘讙诇诇 砖讛 Chrome Driver 诪转讬讬砖谉 讗谞讞谞讜 诪讬讚 专讜讗讬诐 讗转 讝讛 讜讬讻讜诇讬诐 诇转拽谉 (诇注讜诪转 诪讬砖讛讜 砖诪专讬抓 讘讚讬拽讜转 驻注诐 讘讻诪讛 砖讘讜注讜转 讜讗讝 讻诇 讛专爪讛 砖诇 讛讘讚讬拽讜转 诪讞讝讬专讛 讗讬谞住讜祝 讻讬砖诇讜谞讜转 讜讗祝 讗讞讚 诇讗 讝讜讻专 讗诐 讝讛 讗讬 驻注诐 注讘讚). 3. 诇拽讜讞 砖诪转讗诪抓 诇讘谞讜转 转讛诇讬讻讬 注讘讜讚讛 诪住讜讚专讬诐 讘 git 讜讻诇 讛诪转讻谞转讬诐 砖诐 注讘专讜 讛讻砖专讛 诇砖讬诪讜砖 专爪讬谞讬 讘 git 讬爪诇讬讞 诇讛转诪讜讚讚 注诐 拽讜谞驻诇讬拽讟讬诐 讜砖讟讜讬讜转 砖诇 讙讬讟 讛专讘讛 讬讜转专 讟讜讘 诪讞讘专讛 讘讛 讗谞砖讬诐 驻讜讞讚讬诐 诇讬爪讜专 讘专讗谞爪'讬诐. 讗诐 砖讜讜讛 诇讻诐 诇讛转讗诪抓 讻讚讬 诇讘谞讜转 Workflow 讗驻拽讟讬讘讬, 讗诇 转砖讬诪讜 讗讜转讜 讘爪讚, 讗诇 转砖讬诪讜 讗讜转讜 讘讛拽驻讗讛 - 讛砖转诪砖讜 讘讜. 讻诇 讬讜诐, 讻诇 砖讘讜注 讗讜 讻诇 讞讜讚砖. 转讛诇讬讻讬 注讘讜讚讛 砖诇讗 谞讜讙注讬诐 讘讛诐 诪转讬讬砖谞讬诐 讜诪讞诇讬讚讬诐, 讜讗讝 讛讝诪谉 砖讛砖拽注转诐 讘讘谞讬讬转 讛转讛诇讬讱 驻砖讜讟 诪转讘讝讘讝.

ToCode
1 419
# 讗讘讜诇讜爪讬讛 讗讜 专讘讜诇讜爪讬讛 专讘讜诇讜爪讬讛 (诪讛驻讬讻讛 讘注讘专讬转) 拽讜专讬转 讻砖讟讻谞讜诇讜讙讬讛 讞讚砖讛 诪砖谞讛 讗转 讻诇 诪讛 砖讛讬讛 诇驻谞讬讛 讜讝讜专拽转 诇驻讞 讗转 讛注讜诇诐 讛讬砖谉, 讜讗讘讜诇讜爪讬讛 讛讬讗 诪讛 砖拽讜专讛 讻砖讟讻谞讜诇讜讙讬讛 讞讚砖讛 诪讜住讬驻讛 注讜讚 拽讜诪讛 诇诪讘谞讛 砖讗谞讞谞讜 诪讻讬专讬诐. 讘注讘讜讚讛 讘转讜讻谞讛 讗谞讞谞讜 谞转拽诇讬诐 讻诇 讛讝诪谉 讘砖转讬 讛转讜驻注讜转 讜讻诇 讗讞转 驻讜转讞转 住讜讙 讗讞专 砖诇 讛讝讚诪谞讜讬讜转. 诪讛驻讬讻讛 讛讬讗 诪讛 砖拽专讛 讘 2008 讻砖驻讬转讜讞 讬讬砖讜诪讬 讗讬讬驻讜谉 砖讬谞讛 讗转 讻诇 诪讛 砖讬讚注谞讜 注诇 驻讬转讜讞 诪讜讘讬讬诇. 诪驻转讞讬 诪讜讘讬讬诇 诪住讜讬诪讬诐 讛爪诇讬讞讜 诇砖专讜讚 讗转 讛砖讬谞讜讬 讗讘诇 专讘讬诐 讗讞专讬诐 注讘专讜 诇讻转讜讘 拽讜讚 讘诪拽讜诪讜转 讗讞专讬诐, 讜讛诪讜谉 诪驻转讞讬诐 砖讗祝 驻注诐 诇讗 讛讬讛 诇讛诐 砖讜诐 谞讬住讬讜谉 讘诪讜讘讬讬诇 谞讻谞住讜 诇讻转讜讘 讬讬砖讜诪讬 讗讬讬驻讜谉 讜砖讬谞讜 讗转 讛注讜诇诐. 诪讛驻讬讻讛 讚讜诪讛 拽专转讛 专拽 讻诪讛 砖谞讬诐 诪讗讜讞专 讬讜转专 讘注讜诇诐 驻讬转讜讞 讜讜讘, 讻砖讟讻谞讬拽讜转 JavaScript 诪转拽讚诪讜转 拽讬讘诇讜 转诪讬讻讛 诪讜讘谞讬转 讘讚驻讚驻谞讬诐. 诪驻转讞讬 讜讜讘 讜讜转讬拽讬诐 诪爪讗讜 讗转 注爪诪诐 诪讞讜抓 诇诪砖讞拽 讜讛诪讜谞讬 诪驻转讞讬诐 讞讚砖讬诐 砖讛讙讬注讜 诪注讜诇诪讜转 讗讞专讬诐 讛砖转诇讟讜 注诇 讛诪讙专砖. 诪讛驻讬讻讛 讛讬讗 讙诐 诪讛 砖拽专讛 (讘拽谞讛 诪讬讚讛 拽讟谉 讘讛专讘讛) 讻砖 Swift 讜 Kotlin 讛讞诇讬驻讜 讗转 Objective C 讜 Java 讘转讜专 砖驻讜转 讛转讻谞讜转 讛诪专讻讝讬讜转 诇诪讻砖讬专讬 讗讬讬驻讜谉 讜讗谞讚专讜讗讬讚. 讛砖驻讜转 讛讞讚砖讜转 驻转讞讜 讗转 讛讚诇转 诇诪驻转讞讬诐 讞讚砖讬诐 诇讛讬讻谞住, 讜讛谞讬住讬讜谉 砖诇 讛诪驻转讞讬诐 讛讜讜转讬拽讬诐 谞专讗讛 驻转讗讜诐 驻讞讜转 诪专砖讬诐. 诪讛 砖讬驻讛 砖讗讞专讬 讻诇 诪讛驻讬讻讛 讻讝讗转 讛讟讻谞讜诇讜讙讬讛 诪诪砖讬讻讛 诇讛转驻转讞 讘爪讜专讛 砖诇 讗讘讜诇讜爪讬讛: 讙讬专住讛 讞讚砖讛 砖诇 iOS 诇讗 诪砖谞讛 讗转 讻诇 诪讛 砖讬讚注谞讜 注诇 驻讬转讜讞 Objective C, 讗诇讗 诪讜住讬驻讛 讬讻讜诇讜转 讞讚砖讜转 讘讗讜转讜 注讜诇诐 转讜讻谉. 诇讝专讜拽 讛讻诇 讜诇讛转讞讬诇 诪讞讚砖 讝讜 讚专讱 讟讜讘讛 诇讛讻谞讬住 诪驻转讞讬诐 讞讚砖讬诐 诇转讞讜诐 拽驻讜讗, 讜讛诪砖讱 驻讬转讜讞 讜讛讜住驻转 讬讻讜诇讜转 讛讚专讙转讬转 讝讛 诪谞讙谞讜谉 砖注讜讝专 诇讜讜转讬拽讬诐 诇讛专讜讜讬讞 讬讜转专 诪讛谞讬住讬讜谉 砖诇讛诐. 讻砖讗谞讬 诪讞驻砖 诇讙讬讬住 诪转讻谞转 专讬讬诇住 讛讬讜诐, 讻诪讛 砖谞讜转 谞讬住讬讜谉 讬砖 诇讘谉 讗讚诐 讝讛 诪讚讚 诪讗讜讚 诪讗讜讚 讞砖讜讘. 专讬讬诇住 讛讬讗 驻专讬讬诪讜讜专拽 注谞拽讬转 砖讙讚诇讛 讘讗讘讜诇讜爪讬讛 讜诇讻谉 讗讬谉 住讬讻讜讬 砖诪讬 砖注诇讛 注诇 讛专讻讘转 讛讝讗转 诇驻谞讬 砖谞讛 讛爪诇讬讞 诇诇诪讜讚 诪住驻讬拽 专讬讬诇住 讘砖讘讬诇 诇讛讬讜转 诪讜注讬诇. 诇注讜诪转讛 讘驻专讬讬诪讜讜专拽 讻诪讜 Vue, 砖讘讚讬讜拽 注讘专讛 砖讬讻转讜讘 讜讙讬专住讛 3 砖诇讛 砖讜讞专专讛 专拽 讘砖讘讜注讜转 讛讗讞专讜谞讬诐, 讗驻砖专 讘讛讞诇讟 诇讛讬讜转 诪讜注讬诇 讗讞专讬 讻诪讛 讞讜讚砖讬诐 砖诇 谞讬住讬讜谉. 讻诇诇 讗爪讘注 驻砖讜讟 讻砖讗谞讞谞讜 讘讗讬诐 诇诇诪讜讚 讟讻谞讜诇讜讙讬讜转 讞讚砖讜转 讜专讜爪讬诐 诇讛讬讜转 诪讜注讬诇讬诐 讗讬转谉: 讻讻诇 砖讛讟讻谞讜诇讜讙讬讛 讘砖讜拽 讬讜转专 讝诪谉 讜讙讚诇讛 讘爪讜专讛 讗讘讜诇讜爪讬讜谞讬转 讻讱 讬讬拽讞 诪砖诪注讜转讬转 讬讜转专 讝诪谉 诇诇诪讜讚 讗讜转讛 诇专诪讛 讟讜讘讛. 诇讻谉 讻讘专 讘转讞讬诇转 讛诇讬诪讜讚 讻砖讗转诐 讘讜谞讬诐 诇注爪诪讻诐 转讜讻谞讬转 注讘讜讚讛 砖讬诪讜 诇讘 诪转讬 讛讬转讛 讛诪讛驻讻讛 讛讗讞专讜谞讛 砖诐 讜讻诪讛 讝诪谉 讛讟讻谞讜诇讜讙讬讛 讙讚诇讛 讘讗讘讜诇讜爪讬讛. 讛讝诪谉 讛讻讬 讟讜讘 诇讛讬讻谞住 诇讟讻谞讜诇讜讙讬讛 讞讚砖讛 讛讜讗 讻诪讛 砖讬讜转专 拽专讜讘 诇诪讛驻讬讻讛, 讘讛谞讞讛 砖讗转诐 讬讜讚注讬诐 砖讛诪讛驻讬讻讛 讛讜诇讻转 诇讛爪诇讬讞 (讜讻谉 讬砖 住讬诪谞讬诐 - 诇诪砖诇 讗诐 讬砖 讞讘专讛 讙讚讜诇讛 砖诪拽讚诪转 讗转 讝讛 讗讜 砖诪讚讜讘专 讘 Rewrite 砖诇 驻专讬讬诪讜讜专拽 诪讜讻专).

ToCode
1 419
# 诇讗 诪砖讞拽 讗转 讛诪砖讞拽 讛讝讛 讘砖讬讞讛 砖讛讬转讛 诇讬 注诐 讞讘专 讬讜注抓 讘讗讝讜专 住讜祝 讛讞讜驻砖 讛讙讚讜诇 砖诇 2016 讗谞讬 讝讜讻专 砖讛讜讗 住讬驻专 砖讛讜讗 诇讜拽讞 讻诪讛 砖讘讜注讜转 讛驻住拽讛 诪讛讬讬注讜抓 讻讚讬 诇讛讬讻谞住 诇注讜诪拽 诇拽讜讚 砖诇 Angular2. 讛讙讬专住讛 讘讚讬讜拽 讛讙讬注讛 诇 Release 住讜驻讬 讜讛讞讘专 讛讘讬谉 砖讗诐 讛讜讗 讬讬讻谞住 诇拽专讘讬讬诐 砖诇 讛诪注专讻转 讜讬讘讬谉 讻诇 砖讜专讛 讘拽讜讚 讛诪拽讜专 砖诇讛 讝讛 讬讬转谉 诇讜 讛专讘讛 注讘讜讚讛 讘砖谞讬诐 讛拽专讜讘讜转, 讻讻诇 砖讗谞砖讬诐 讬讬驻专讚讜 诪讗谞讙讜诇专1 讜讬砖讚专讙讜 诇讙讬专住讛 2. 讜讛讜讗 爪讚拽 讘讙讚讜诇. 讘讗讜转讜 讝诪谉 砖讛讜讗 诇诪讚 讗转 讗谞讙讜诇专2 讛讬讜 注讜讚 注砖专讜转 讟讻谞讜诇讜讙讬讜转 讗讞专讜转 讘专诪讜转 砖讜谞讜转 砖诇 讘砖诇讜转 砖讗驻砖专 讛讬讛 诇诇诪讜讚. 讛讬讜 讛诪讜谉 讗谞砖讬诐 砖讞砖讘讜 砖讗谞讙讜诇专1 讬讬砖讗专 讗讬转谞讜 诇谞爪讞, 砖讗谞砖讬诐 讬驻讞讚讜 诇砖讚专讙, 砖讘讻诇诇 专讬讗拽讟 讛讜诇讻转 诇讛讬讜转 讛讚讘专 讛讙讚讜诇 讛讘讗. 讛讘讞讬专讛 诇注讝讜讘 讛讻诇 讜诇讛转专讻讝 讘诇讬诪讜讚 讟讻谞讜诇讜讙讬讛 讗讞转 讛讬讗 讘讛讻专讞 讘讞讬专讛 诇讜讜转专 注诇 讛专讘讛 住讜住讬诐 讗讞专讬诐 砖专爪讬诐 讘讗讜转讜 讝诪谉. 诇讗 爪专讬讱 讞讜讚砖讬诐 讘砖讘讬诇 诇讛爪诇讬讞 诇讻转讜讘 转讜讻谞讬转 Hello World 讗讜 诇讛讘讬谉 讘讙讚讜诇 讗讬讱 诇讛砖转诪砖 讘讻诇讬 讗讜 讗驻讬诇讜 诇讻转讜讘 诪砖讛讜 诪讜注讬诇. 讻砖讗谞讬 讘讜讞专 诇诇诪讜讚 诪砖讛讜 讘拽讟谞讛 诪讛专 诪讗讜讚 讗讜讻诇 诇讛诪砖讬讱 诇讚讘专 讛讘讗, 讜讝讛 砖讗讞专讬讜 讜讝讛 砖讗讞专讬讜. 讛讘讞讬专讛 诇讛讬讻谞住 诇拽讜讚 讛诪拽讜专 砖诇 驻专讬讬诪讜讜专拽 讜诇讛讻讬专 讗讜转讛 诇注讜诪拽 讛讬讗 讻谉 讘讞讬专讛 砖讚讜专砖转 讛砖拽注讛. 讗讬 讗驻砖专 诇注砖讜转 讗转 讝讛 注诐 讬讜转专 诪讟讻谞讜诇讜讙讬讛 讗讞转 驻注诐 讘讻诪讛 砖谞讬诐 讜讙诐 讗讬谉 爪讜专讱. 讗讜转讜 讞讘专 讛专讜讜讬讞 讛专讘讛 讬讜转专 诪讛专讘讛 讬讜注爪讬 讗谞讙讜诇专 讗讞专讬诐, 专拽 讘讝讻讜转 讗讜转诐 讻诪讛 砖讘讜注讜转 砖诇 讛转诪住专讜转 讜讗讞专讬讛诐 注讜讚 讻诪讛 讞讜讚砖讬诐 砖诇 讛诪砖讱 诇诪讬讚讛. 讻砖讗谞讞谞讜 诪转诇讘讟讬诐 诇讙讘讬 讛爪注讚 讛讘讗 讜专讜讗讬诐 讛诪讜谉 讛诪讜谉 讟讻谞讜诇讜讙讬讜转 诪驻转讜转 诪住讘讬讘, 砖讜讜讛 诇讝讻讜专 砖讻诇 诪砖讞拽 砖讗谞讬 讘讜讞专 诇砖讞拽 讘讜 讘讗 注诇 讞砖讘讜谉 注砖专讜转 诪砖讞拽讬诐 讗讞专讬诐 砖讘讛诐 诇讗 讗砖讞拽 诇注讜诇诐. 拽砖讛 诪讗讜讚 诇讛专讜讜讬讞 讗诐 讗谞讬 讬讜讚注 讛诪讜谉 讛诪讜谉 讚讘专讬诐 讘专诪讛 谞诪讜讻讛; 讛专讘讛 讬讜转专 拽诇 诇讛转拽讚诐 讻砖诪转诪讬讚讬诐 讘讻讬讜讜谉 讗讞讚.

ToCode
1 419
# 砖讻讞讜 专拽 诇住驻专 砖... 讞讘专 砖诇讞 诇讬 诇讬谞拽 诇住驻专讬讬转 Server Side Rendering 讞讚砖讛 讘砖诐 iSSR. 讘转讜讱 讛讚讜讙诪讛 讘转讬注讜讚 讗谞讞谞讜 诪讜爪讗讬诐 讗转 讛砖讜专讛 讛讘讗讛:
const { html, state } = await serverRender(() => <App />);
讗讘诇 讘砖讜诐 诪拽讜诐 讘讗讜转讜 讚祝 转讬注讜讚 诇讗 诪讜驻讬注讛 讛诪讬诇讛 cache. 讝讛 讗讜诪专 砖讗诐 讗谞讬 诇讗 讬讜讚注 讻诇讜诐 注诇 Server Side Rendering 讜专拽 拽讜专讗 讗转 讛转讬注讜讚 砖诇 讛住驻专讬讛, 讬砖 住讬讻讜讬 讟讜讘 砖讗爪诇讬讞 诇讘谞讜转 拽讜讚 SSR 讘注讝专转讛 讗讘诇 讻砖讛拽讜讚 讛讝讛 讬讙讬注 诇诪砖转诪砖讬诐 讗诪讬转讬讬诐 讛砖专转 讬讬驻讜诇 诪讛注讜诪住. 讘讞讬讬诐 诪讗讜讚 诪讜注讬诇 讜诪注谞讬讬谉 诇拽专讜讗 转讬注讜讚 砖诇 住驻专讬讜转. 讗讘诇 讘砖讘讬诇 砖讛拽专讬讗讛 转讛讬讛 讗驻拽讟讬讘讬转 讞砖讜讘 诇讛讙讬注 诇转讬注讜讚 诪讜讻谞讬诐 注诐 讛讘谞讛 砖诇: 1. 诪讛 注讜诇诐 讛转讜讻谉 讛专诇讜讜谞讟讬 砖诇 讛住驻专讬讛 讛讝讜? 2. 讗讬讝讛 住驻专讬讜转 讗讞专讜转 讗谞讬 诪讻讬专 砖驻讜转专讜转 讗转 讗讜转讛 讘注讬讛? 3. 诪讛 讛讘注讬讜转 讛讻讬 谞驻讜爪讜转 讘砖讬诪讜砖 讘住驻专讬讜转 诪讛住讜讙 讛讝讛? 4. 讗讬讱 讛住驻专讬讛 讛讝讗转 讘讞专讛 诇讛转诪讜讚讚 注诐 讛拽砖讬讬诐 砖讻讜诇诐 谞转拽诇讜 讘讛诐? 讛讬讻专讜转 讟讜讘讛 注诐 注讜诇诐 讛转讜讻谉 讬讻讜诇讛 诇诪拽讚 讗转讻诐 讘拽专讬讗转 讛转讬注讜讚 讜诇讞住讜讱 讛专讘讛 讚讗讙讜转 讘注转 砖讬诇讜讘 讛住驻专讬讛 讛讞讚砖讛 讘拽讜讚 砖诇讻诐.

ToCode
1 419
# 砖拽专讬诐 砖住讬驻专讜 诇讬 注诇 讻住祝 讘诪砖讞拽 诪专讬讜 讻讜诇诐 诪转讞讬诇讬诐 注诐 5 讞讬讬诐. 砖讞拽谞讬诐 讟讜讘讬诐 讬讻讜诇讬诐 诇讛讙讬注 诪讗讜讚 专讞讜拽 讘诪砖讞拽 讻诪注讟 讘诇讬 诇讛讬驻住诇, 讜砖讞拽谞讬诐 讙专讜注讬诐, 谞讜, 讗驻讬诇讜 讗诐 讛讬讜 诇讛诐 20 讞讬讬诐 讝讛 诇讗 讛讬讛 注讜讝专. 讛诐 注讚讬讬谉 讛讬讜 转拽讜注讬诐 讘砖诇讘讬诐 讛专讗砖讜谞讬诐. 讘诪专讬讜, 讻诪讜 讘诪砖讞拽讬 讗专拽讬讬讚 讗讞专讬诐, 拽诇 诇专讗讜转 砖讘砖讘讬诇 诇讛砖转驻专 爪专讬讱 诇讛转讗诪谉: 诇讛讬讻谞住 诇讗讜转讜 砖诇讘 砖讜讘 讜砖讜讘, 诇谞住讜转 诇讞拽讜专 讗转 讛砖诇讘, 诇注砖讜转 讚讘专讬诐 拽爪转 讗讞专转 讻诇 驻注诐. 诇驻注诪讬诐 讛讗讬诪讜谉 专抓 讞诇拽 讜讗谞讬 诪爪诇讬讞 诇讙诇讜转 爪讬谞讜专 讞讚砖 讘诇讬 诇讛讬驻住诇, 讗讘诇 讘讚专讱 讻诇诇 诪砖讞拽讬 讗讬诪讜谉 谞讙诪专讬诐 讘住讜祝 注诐 Game Over. 讜讝讛 讗讞诇讛. 讛诪讟专讛 砖诇 诪砖讞拽讬 讛讗讬诪讜谉 讛讗诇讛 讛讬讗 诇讗 诇讛讙讬注 讻诪讛 砖讬讜转专 专讞讜拽 讗讜 诇讻诪讛 砖讬讜转专 谞拽讜讚讜转. 讛讬讗 讘住讱 讛讻诇 诇讛转讗诪谉 讻讚讬 诇讛讬讜转 砖讞拽谉 讟讜讘 讬讜转专 - 砖讞拽谞讬诐 讟讜讘讬诐 诪爪诇讬讞讬诐 诇住讬讬诐 讗转 讛诪砖讞拽 讛专讘讛 讬讜转专 讘拽诇讜转 讘讛砖讜讜讗讛 诇砖讞拽谞讬诐 诇讗 讟讜讘讬诐. 注讻砖讬讜 讘讜讗讜 谞讚讘专 注诇 讻住祝. 讻住祝 讛讜讗 诇讗 讛诪讟专讛 讘诪砖讞拽 讛诪爪讞讬拽 砖诇 讛讞讬讬诐, 讜讛讜讗 讗驻讬诇讜 诇讗 讛诪讟专讛 讘诪砖讞拽 讛讻诇讻诇讬. 讻讜诇谞讜 砖诪注谞讜 注诇 讛讬讝诪讬诐 砖讙讬讬住讜 诪讗讜转 诪讬诇讬讜谞讬诐 讜讛驻住讬讚讜 讛讻诇, 讜讬讝诪讬诐 讗讞专讬诐 砖讻诪注讟 讘诇讬 讙讬讜住 讛爪诇讬讞讜 诇讘谞讜转 诪讜爪专 砖诪砖谞讛 讗转 讛注讜诇诐. 诪讛 砖讛讜驻讱 讬讝诪讬诐 诪住讜讬诪讬诐 诇讟讜讘讬诐 讬讜转专 诪讗讞专讬诐 讝讛 诇讗 讻诪讛 讻住祝 讬砖 诇讛诐, 讝讛 诇讗 讻诪讛 拽砖专讬诐 讬砖 诇讛诐, 讝讛 诇讗 讻诪讛 住讟讗专讟-讗驻讬诐 讛诐 讛拽讬诪讜 讗讜 诇讗. 讝讜 诪讬讜诪谞讜转 讜讗驻砖专 诇讛砖转驻专 讘讛. 诇讻谉 讛讟讬驻 讛讬讜诐 诪讬讜注讚 诇驻专讬诇讗谞住专讬诐 砖拽讜专讗讬诐 讗转 讝讛: 讻诪讛 讻住祝 讛讜爪讗转诐 讗讜 讛讻谞住转诐 讛讞讜讚砖 讝讛 诪讚讚 讚讬 讙专讜注 诇讛爪诇讞讛. 讗谞讞谞讜 诪住转讻诇讬诐 注诇 讛诪住驻专 讛讝讛, 讻诪讜 注诇 讻诪讜转 讛讞讬讬诐 砖讬砖 讘诪砖讞拽 诪专讬讜, 专拽 讘讙诇诇 砖讝讛 诪住驻专 砖拽诇 诇讛住转讻诇 注诇讬讜. 讗讘诇 讗诐 爪专讬讱 诇讘讞讜专 讛砖讞拽谞讬诐 砖讬爪诇讬讞讜 诇讛讙讬注 专讞讜拽 讛诐 诇讗 讗诇讛 砖讬砖 诇讛诐 讬讜转专 讻住祝 讘驻转讬讞讛, 讗诇讗 讗诇讛 砖讬讜讚注讬诐 讬讜转专 讟讜讘 诇砖讞拽 讗转 讛诪砖讞拽.

ToCode
1 419
讘注讜诇诪讜转 诪拽讘讬诇讬诐 诇专讬讬诇住 拽讜谞住驻讟 讚讜诪讛 讻讘专 拽讬讬诐 讘驻讬谞讬拽住 (谞拽专讗 LiveView), 讘 Django 砖诐 讝讛 谞拽专讗 Reactor 讜讻讘专 讛转讞讬诇讜 诇讚讘专 注诇 讝讛 讘注讜诇诐 砖诇 专讬讗拽讟 注诐 诪砖讛讜 砖谞拽专讗 Server Components. 讛讗诐 讗谞讞谞讜 讛讜诇讻讬诐 诇专讗讜转 讞讝专讛 诇爪讚 讛砖专转 讘拽专讜讘? 注讚讬讬谉 拽砖讛 诇讚注转. 讗讘诇 讛驻讜讟谞爪讬讗诇 诪讘讞讬谞转 砖讬驻讜专 讘讝诪谞讬 讟注讬谞讛, 讙讜讚诇 讛讗转专讬诐 讜驻砖讟讜转 讛驻讬转讜讞 讘讛讞诇讟 谞砖诪注 诪诇讛讬讘.

ToCode
1 419
# 驻讬转讜讞 讬讬砖讜诪讬 Front End 讘爪讚 砖专转 讟专谞讚 讞讚砖 讘驻讬转讜讞 讬讬砖讜诪讬 驻专讜谞讟 讗谞讚 讬讜爪讗 诪谞拽讜讚转 讛谞讞讛 砖拽讜讚 讛 JavaScript 砖讗谞讞谞讜 讻讜转讘讬诐 讛驻讱 诪住讜讘讱 诪讚讬, 讙诐 讘砖讘讬诇 讛诪转讻谞转讬诐 讜讙诐 讘砖讘讬诇 讛讚驻讚驻谞讬诐 砖爪专讬讻讬诐 诇讛专讬抓 讗讜转讜, 讜诇讻谉 砖讜讜讛 诇谞住讜转 诇讛讞讝讬专 讞诇拽 诪讛诇讜讙讬拽讛 诇爪讚 讛砖专转. 讘讜讗讜 谞专讗讛 讗讬讱 讝讛 注讜讘讚 讘 Rails 讜讗讞专讬 讝讛 讻诪讛 诪讬诇讬诐 注诇 讛讛砖诇讻讜转 讙诐 讘诪拽讜诪讜转 讗讞专讬诐. ## 专讬讬诇住 讜 Stimulus Reflex 讛住驻专讬讛 StimulusReflex 讘专讬讬诇住 诪讗驻砖专转 诇驻转讞 讬讬砖讜诪讬 爪讚-诇拽讜讞 注砖讬专讬诐 诇诇讗 讻转讬讘转 JavaScript (讗讜 注诐 讻转讬讘转 讛专讘讛 驻讞讜转 JavaScript 诪诪讛 砖讛讬讬谞讜 诪爪驻讬诐). 讛讗专讻讬讟拽讟讜专讛 砖诇讛 驻砖讜讟讛 讜谞砖诪注转 讘诪讘讟 专讗砖讜谉 拽爪转 诇讗 讛讙讬讜谞讬转: 1. 讻诇 诇拽讜讞 砖诪转讞讘专 诇讗转专 驻讜转讞 Web Socket 诇砖专转. 2. 讻砖诇拽讜讞 诪讘爪注 驻注讜诇讛 讗谞讞谞讜 砖讜诇讞讬诐 讗转 讛诪讬讚注 讛诪注谞讬讬谉 注诇 讛驻注讜诇讛 诇砖专转 讚专讱 讛 Web Socket, 讛砖专转 诪讟驻诇 讘讗讬专讜注 讜诪讞讝讬专 拽讜讚 HTML 讞讚砖 诇诇拽讜讞. 3. 讛诇拽讜讞 诪讞诇讬祝 讗转 讛 HTML 砖讛讬讛 诇讜 讘诪讛 砖讛讙讬注 诪讛砖专转. 讘爪讜专讛 讻讝讗转 讗谞讞谞讜 诪拽讘诇讬诐 讗驻诇讬拽爪讬讬转 Front End 注砖讬专讛 讻诪讜 砖讗谞讞谞讜 专讙讬诇讬诐 注诐 讛驻专讬讬诪讜讜专拽讬诐, 讗讘诇 讘诇讬 拽讜讚 JavaScript 讻讬 讻诇 讛讟讬驻讜诇 讘讗讬专讜注讬诐 注讜讘专 诇爪讚 砖专转. 诇讗 爪专讬讱 诇砖讘讜专 讗转 讛专讗砖 注诇 住讬谞讻专讜谉 讗讜 驻讬转讜讞 API 讻讬 讛诪讬讚注 驻砖讜讟 讝诪讬谉 讗讬驻讛 砖讛拽讜讚 专抓. ## 讚讜讙诪讛 1 - 诪讜谞讛 诇讞讬爪讜转 拽讜讚? 讘专讜专. 讘砖讘讬诇 讝讛 讘讗谞讜. 讗讞专讬 砖诪住讬讬诪讬诐 诇讛转拽讬谉 讗转 讛住驻专讬讛 诇驻讬 讛诪讚专讬讱 砖诇讛诐 讗谞讞谞讜 诪诪砖讬讻讬诐 诇讻转讜讘 讘爪讚 讛砖专转 "专驻诇拽住", 砖讝讛 拽讜讚 讟讬驻讜诇 讘讗讬专讜注. 讛谞讛 讗讞讚 讻讝讛 诇讚讜讙诪讛:
# file: app/reflexes/counter_reflex.rb

class CounterReflex < ApplicationReflex
  def increment
    @count = element.dataset[:count].to_i + 1
  end
end
讝讛 拽讜讘抓 专讜讘讬 砖诪讙讚讬专 驻讜谞拽爪讬讛 讘砖诐 increment. 讛驻讜谞拽爪讬讛 诇讜拽讞转 诪讛讗诇诪谞讟 讗转 讛诪讗驻讬讬谉 data-count, 讛讜驻讻转 讗讜转讜 诇诪住驻专 讜诪讜住讬驻讛 讗讞讚. 讗转 讛转讜爪讗讛 讛讬讗 砖讜诪专转 讘诪砖转谞讛 讘砖诐 @count. 讘砖讘讬诇 诇讛砖转诪砖 讘专驻诇拽住 讗谞讬 诪讙讚讬专 讗转 讛诪讘谞讛 讛讘讗 讘转讜讱 讛 HTML 砖诇讬 讘拽讜讘抓 讛 View:
<div id="counter-demo" data-reflex-root="#counter-demo">
  <button
    data-reflex="click->Counter#increment"
    data-count="<%= @count %>"
  >

    Click Here
  </button>
  <p>You clicked <%= @count.to_i %> times</p>
</div>
讬砖 诇谞讜 讻驻转讜专 注诐 诪讗驻讬讬谉 讘砖诐 data-reflex 砖诪讙讚讬专 讗讬讝讛 专驻诇拽住 讬讬拽专讗 讻砖诇讜讞爪讬诐 注诇讬讜 讜诪讗驻讬讬谉 data-count 砖谞砖诇讞 诇专驻诇拽住. 讗谞讬 诪砖转诪砖 讘诪砖转谞讛 @count 讘讻诇 讛讘诇讜拽 砖讘转讜讱 讗诇诪谞讟 counter-demo 讜诇讻谉 讛讙讚专转讬 讗转 counter-demo 讘转讜专 砖讜专砖 注抓 讛专驻诇拽住. 讘讗讜驻谉 讗讜讟讜诪讟讬 讗讞专讬 讘讬爪讜注 讛专驻诇拽住 专讬讬诇住 讬讘谞讛 诪讞讚砖 讗转 讛 HTML 讜讬砖诇讞 讗讜转讜 诇爪讚 讛诇拽讜讞, 讜拽讜讚 JavaScript 讘爪讚 讛诇拽讜讞 讬讞诇讬祝 讗转 讛讗诇诪谞讟讬诐 讛专诇讜讜谞讟讬诐 讘转讜讱 data-reflex-root 讘注专讻讬诐 讛讞讚砖讬诐 砖诇讛诐. 讛转讜爪讗讛 讻诪讜 砖讗转诐 讘讟讞 诪讚诪讬讬谞讬诐 讻讘专 讛讬讗 诪讜谞讛 诇讞讬爪讜转 砖诪爪讬讙 讻驻转讜专 讜讗讞专讬讜 驻讬住拽讛 砖诪住驻专转 讻诪讛 驻注诪讬诐 诇讞爪讜 注诇 讛讻驻转讜专. ## 讚讜讙诪讛 2 - 讛砖诇诪讛 讗讜讟讜诪讟讬转 讘讙诇诇 砖拽讜讚 讛讟讬驻讜诇 讘讗讬专讜注 专抓 讘爪讚 讛砖专转 讬砖 诇讬 砖诐 讙讬砖讛 诪诇讗讛 诇讘住讬住 讛谞转讜谞讬诐 讜诇讻诇 讛诪讬讚注 砖诇 讛砖专转. 讛讚讜讙诪讛 讛讘讗讛 诪诪讞讬砖讛 讗转 讛讬讜驻讬 讘讙讬砖讛 讘讗诪爪注讜转 专讻讬讘 砖诇 讛砖诇诪讛 讗讜讟讜诪讟讬转. 谞转讞讬诇 注诐 拽讜讚 爪讚 讛砖专转:
class ExampleReflex < ApplicationReflex
  def autocomplete
    search_text = element.value

    @options = User.where("name like 'search_text%'").pluck(:name)
  end
end
讘讙诇诇 砖讗谞讞谞讜 专爪讬诐 讘爪讚 砖专转 讗讬谉 讘注讬讛 诇讙砖转 诇讘住讬住 讛谞转讜谞讬诐 讜诇诪砖讜讱 诪砖诐 讗转 讻诇 讛诪砖转诪砖讬诐 砖讛砖诐 砖诇讛诐 诪转讞讬诇 讘讟拽住讟 砖讻转讜讘 讘 input. 砖讜诪专讬诐 讗转 讛专砖讬诪讛 讘诪砖转谞讛 @options 讜讘 HTML 讗驻砖专 诇讻转讜讘 讗转 讛拽讜讚 讛讘讗:
<div id="ajax-autocomplete-demo" data-reflex-root="#autocomplete-options">
  <input type="text" data-reflex="input->Example#autocomplete" list="autocomplete-options" />
  <datalist id="autocomplete-options">
    <%= @options&.each do |val| %>
      <option value="<%= val %>" />
    <% end %>
  </datalist>
</div>
讘讗讜驻谉 讗讜讟讜诪讟讬 讻诇 驻注诐 砖诪砖转诪砖 诪拽诇讬讚 讟拽住讟 讘转讬讘讛 讛讟拽住讟 谞砖诇讞 诇砖专转, 讛砖专转 砖讜诇祝 诪讘住讬住 讛谞转讜谞讬诐 讗转 专砖讬诪转 讗驻砖专讜讬讜转 讛讛砖诇诪讛 讛诪注讜讚讻谞转 讜诪讞讝讬专 诇诇拽讜讞, 砖讘转讜专讜 诪注讚讻谉 讗转 讛专砖讬诪讛 讗爪诇讜 讘爪讜专讛 讗讜讟讜诪讟讬转. ## 诪讛 讛诇讗讛 爪专讬讱 诇讝讻讜专 砖讛讙注谞讜 诇讻讗谉 讻讬 拽讜讚 讛 JavaScript 砖讗谞讞谞讜 讻讜转讘讬诐 讛驻讱 诪住讜讘讱 诪讚讬: 诪住讜讘讱 诪讚讬 诇讞诇拽 诪讛诪转讻谞转讬诐 讜诇讗 驻讞讜转 讞砖讜讘 诪住讜讘讱 诪讚讬 诇讚驻讚驻谞讬诐. 讛讬讜诐 注诪讜讚讬 讜讜讘 讟讬驻讜住讬讬诐 讻讜诇诇讬诐 诪住驻专 诪讙讛 讘讬讬讟讬诐 砖诇 拽讜讚 JavaScript, 讜砖讬驻讜专 讝诪谞讬 讟注讬谞讛 讜讘讬爪讜注讬诐 讛谉 讘讬谉 讛讚讗讙讜转 讛讙讚讜诇讜转 砖诇 诪驻转讞讬 驻专讜谞讟 讗谞讚. 讘诪讘讟 专讗砖讜谉 讛诪注讘专 诇讟驻诇 讘讞诇拽 诪讛讗讬专讜注讬诐 讘爪讚 砖专转 讜砖诇讬讞转 HTML 讘诪拽讜诐 拽讜讚 谞砖诪注 讻诪讜 驻讬转专讜谉 讟讜讘 诇砖转讬 讛讘注讬讜转. 讘诪讻讛 讗讞转 讗谞讞谞讜 讞讜讝专讬诐 诇拽讜讚 驻砖讜讟 讬讜转专 讜讬注讬诇 讬讜转专. 讬讛讬讛 诪注谞讬讬谉 诇专讗讜转 讗讬讱 驻专讬讬诪讜讜专拽讬诐 讻讗诇讛 讬住转讚专讜 讘注讜诇诐 讛讗诪讬转讬 注诐 注讜诪住 砖诇 诪砖转诪砖讬诐 讗诪讬转讬讬诐.

ToCode
1 419
# 砖转讬 转诪讜谞讜转 砖诇 讛讚专讻讛 讘转诪讜谞讛 讛专讗砖讜谞讛 谞讚诪讬讬谉 拽讛诇 砖诪住转讻诇 讘砖拽讬拽讛 注诇 诪专爪讛 讻专讬讝诪讟讬, 讘住讙谞讜谉 讗讜诇诐 砖诇 Ted 砖诪诇讗 注讚 讗驻住 诪拽讜诐 讜讻讜诇诐 诪讞讻讬诐 诇砖拽祝 诪注讜专专 讛讛砖专讗讛 讛讘讗. 讘转诪讜谞讛 讛砖谞讬讛 谞讚诪讬讬谉 拽讘讜爪转 讗谞砖讬诐 讘住讚谞转 谞讙专讜转, 讻诇 讗讞讚 诇讬讚 讛砖讜诇讞谉 砖诇讜 注诐 讛爪讬讜讚 诪住讜讚专 讜讗讬讝讛 谞讙专 讞讘讬讘 诪讚讙讬诐 讜注讜讘专 讘讬谉 讛转诇诪讬讚讬诐 诇转拽谉 讗转 讛住讙谞讜谉. 诪住讬讘讜转 砖讗谞讬 诇讗 诪讘讬谉 注讚 讛住讜祝 注讜诇诐 讛讛讚专讻讛 讛诪拽爪讜注讬转 诇讛讬讬讟拽 谞讜讟讛 讘爪讜专讛 讞讚讛 诇讻讬讜讜谉 讛转诪讜谞讛 讛专讗砖讜谞讛. 讗诐 讝讛 注讜讘讚 诇讻诐 讝讛 诪注讜诇讛, 讗讘诇 砖讜讜讛 诇讝讻讜专 砖讗诐 谞讬住讬转诐 诇讛注讘讬专 砖注转 讛注砖专讛 讘注讘讜讚讛 讗讜 讛专爪讗讛 讘诪讬讟讗驻 讜讝讛 诇讗 注讘讚 讻诪讜 砖转讻谞谞转诐 - 讻讚讗讬 诇谞住讜转 讘驻注诐 讛讘讗讛 讗转 讛转诪讜谞讛 讛砖谞讬讛.

ToCode
1 419
讛诪讻砖讜诇 讛讗讞专讜谉 讘专砖讬诪讛 讛讜讗 讛住讞讜转 讚注转 讜住驻爪讬驻讬转 讘诇讬诪讜讚讬 讟讻谞讜诇讜讙讬讛 诪讚讜讘专 注诇 讛谞讟讬讛 砖诇谞讜 诇讛专讙讬砖 砖"讛讘谞讜 讗转 讛驻讜讗谞讟讛" 讜诇讛诪砖讬讱 诇诇诪讜讚 讗转 讛讚讘专 讛诪诇讛讬讘 讛讘讗. 讗讬 讗驻砖专 诇诇诪讜讚 专讬讗拽讟 讘砖讘讜注讬讬诐 讗讜 Front End 讘讞讜讚砖. 讛讚讘专讬诐 讛讗诇讛 诇讜拽讞讬诐 讝诪谉 讜讛讙注讛 诇专诪讛 诪拽爪讜注讬转 专爪讬谞讬转 讝讛 诪砖讛讜 砖讚讜专砖 驻讜拽讜住 讜讛砖拽注讛 诇讗讜专讱 讝诪谉. 拽讜专住 讗讜谞诇讬讬谉 讜讘谞讬讬转 驻专讜讬拽讟 拽讟谉 驻砖讜讟 诇讗 诪住驻讬拽讬诐. 讗谞讬 讬讜讚注 砖讘讻诇 谞拽讜讚转 讝诪谉 讛讚讘专-砖讗谞讬-诇讜诪讚-注讻砖讬讜 讛讜讗 讛专讘讛 驻讞讜转 诪注谞讬讬谉 诪-讛讚讘专-讛诪讚诇讬拽-砖讻讜诇诐-诪讚讘专讬诐-注诇讬讜, 驻砖讜讟 讘讙诇诇 拽爪讘 讛砖讬谞讜讬讬诐 讘转注砖讬讛 讜讛注讜讘讚讛 砖讚讘专讬诐 讞讚砖讬诐 诪讜驻讬注讬诐 讛专讘讛 讬讜转专 诪讛专 诪诪讛 砖诇讜拽讞 诇诇诪讜讚 讗转 讛讚讘专讬诐 讛拽讜讚诪讬诐. 讬讞讚 注诐 讝讗转 讛住讞讜转 讚注转 讜诪注讘专 讘讬谉 讟讻谞讜诇讜讙讬讜转 诪讘讝讘讝讬诐 讗转 讛讝诪谉 砖诇谞讜 讜诪讜专讬讚讬诐 诇谞讜 讗转 讛讘讬讟讞讜谉 讛注爪诪讬. 讻砖讗转诐 讘转讜讱 诇讬诪讜讚 砖诇 讟讻谞讜诇讜讙讬讛 讜诪专讙讬砖讬诐 砖讻诇 讛注讜诇诐 注讘专 诇讚讘专 注诇 讛讚讘专 讛讙讚讜诇 讛讘讗, 砖讜讜讛 诇拽讞转 讗讜讜讬专, 诇住讙讜专 讗转 讛专讚讬讟 讜诇讞讝讜专 诇住驻专讬诐. 讬讛讬讛 讝诪谉 诇诇诪讜讚 讗转 讛讚讘专 讛讙讚讜诇 讛讘讗 讗讞专讬 砖谞讛讬讛 讟讜讘讬诐 讘诪讛 砖讗谞讞谞讜 诇讜诪讚讬诐 注讻砖讬讜. ## 拽专讚讬讟 诪讬 砖讛专讗转讛 诇讬 讗转 讗专讘注转 讛诪讻砖讜诇讬诐 讛讗诇讛 讛讬讗 驻讜讚拽住讟专讬转 讘砖诐 拽诇讜转讬诇讚 讚讜住讜诇讬讬讛 砖诪注讘讬专讛 驻讜讚拽住讟 讘砖诐 changemavie. 讛驻讜住讟 讛讝讛 诪讘讜住住 注诇 讛驻专拽 讛讗讞专讜谉 讘驻讜讚拽住讟 讜讗诐 讗转诐 诪讘讬谞讬诐 爪专驻转讬转 讗谞讬 诪讗讜讚 诪诪诇讬抓 诇讛拽砖讬讘 诇讛 讬砖讬专讜转.