• Ruby on Rails 开发笔记


    安装 Ruby on Rails

    创建应用

    MacOS 平台

    # 创建新的应用程序
    $ rails new blog
    $ cd blog
    # 安装 yarn
    $ brew install yarn
    # 安装 webpacker
    $ rails webpacker:install
    # 启动服务器
    $ rails server
    # http://localhost:3000 可访问网页
    

    Windows 平台

    • 创建新的应用程序
    • 安装 yarn
    • 安装 node
    • 安装 webpacker

    官方示例

    Rails 入门

    控制器生成器

    使用 generate controller 命令(控制器生成器)来自动生成控制器(controller),视图(view) 以及动作(action)

    # 生成 Welcome 控制器以及它的 index 动作 
    $ rails generate controller Welcome index
    

    主要生成下面两个文件

    • app/controllers/welcome_controller.rb
      控制器文件
    • app/views/welcome/index.html.erb
      嵌入式Ruby文件
    • http://localhost:3000/welcome/index
      Rails 将把该请求映射为 Welcome 控制器的 index 动作

    路由

    通过修改 config/routes.rb 文件来设定路由

    Rails.application.routes.draw do
      get 'welcome/index'
      resources :articles do
        resources :comments
      end 
      root 'welcome#index'
    end
    

    使用 routes 命令来确认路由

    $ rails routes
                  Prefix Verb   URI Pattern                                        Controller#Action
           welcome_index GET    /welcome/index(.:format)                           welcome#index
        article_comments GET    /articles/:article_id/comments(.:format)           comments#index
                         POST   /articles/:article_id/comments(.:format)           comments#create
     new_article_comment GET    /articles/:article_id/comments/new(.:format)       comments#new
    edit_article_comment GET    /articles/:article_id/comments/:id/edit(.:format)  comments#edit
         article_comment GET    /articles/:article_id/comments/:id(.:format)       comments#show
                         PATCH  /articles/:article_id/comments/:id(.:format)       comments#update
                         PUT    /articles/:article_id/comments/:id(.:format)       comments#update
                         DELETE /articles/:article_id/comments/:id(.:format)       comments#destroy
                articles GET    /articles(.:format)                                articles#index
                         POST   /articles(.:format)                                articles#create
             new_article GET    /articles/new(.:format)                            articles#new
            edit_article GET    /articles/:id/edit(.:format)                       articles#edit
                 article GET    /articles/:id(.:format)                            articles#show
                         PATCH  /articles/:id(.:format)                            articles#update
                         PUT    /articles/:id(.:format)                            articles#update
                         DELETE /articles/:id(.:format)                            articles#destroy
                    root GET    /                                                  welcome#index
    

    Articles Comments 控制器

    # 生成 Articles 控制器
    $ rails generate controller Articles
    # 生成 Comments 控制器
    $ rails generate controller Comments
    

    Article Comment 模型

    # 生成 Article 模型,然后创建 db
    $ rails generate model Article title:string text:text
    $ rails db:migrate
    # 生成 Comment 模型,然后更新 db
    $ rails generate model Comment commenter:string body:text article:references
    $ rails db:migrate
    

    模型生成器主要生成下面两种文件

    • app/models/article.rb
      app/models/comment.rb
      模型文件
    • db/migrate/20200504035451_create_articles.rb
      db/migrate/20200504050736_create_comments.rb
      数据迁移指令Ruby文件

    模型类代码

    app/models/article.rb 文件

    class Article < ApplicationRecord
      has_many :comments, dependent: :destroy
      validates :title, presence: true,
                        length: { minimum: 5 }
    end
    

    app/models/comment.rb 文件

    class Comment < ApplicationRecord
      belongs_to :article
    end
    

    控制器类代码

    app/controllers/articles_controller.rb 文件

    class ArticlesController < ApplicationController
     
      http_basic_authenticate_with name: "dhh", password: "secret", except: [:index, :show]
     
      def index
        @articles = Article.all
      end
    
      def show
        @article = Article.find(params[:id])
      end
    
      def new
        @article = Article.new
      end
    
      def edit
        @article = Article.find(params[:id])
      end
    
      def create
        @article = Article.new(article_params)
    
        if @article.save
          redirect_to @article
        else
          render 'new'
        end
      end
    
      def update
        @article = Article.find(params[:id])
    
        if @article.update(article_params)
          redirect_to @article
        else
          render 'edit'
        end
      end
    
      def destroy
        @article = Article.find(params[:id])
        @article.destroy
    
        redirect_to articles_path
      end
    
    private
      def article_params
        params.require(:article).permit(:title, :text)
      end
    end
    

    下面是该控制器类所包含的方法以及它们所对应的路由

    • index(列表)GET /articles
    • show(显示)GET /articles/:id
    • new(新建)GET /articles/new
    • edit(编辑)GET /articles/:id/edit
    • create(创建)PATCH/POST /articles
    • update(更新)PUT /articles/:id
    • destroy(删除)DELETE /articles/:id

    app/controllers/comments_controller.rb 文件

    class CommentsController < ApplicationController
     
      http_basic_authenticate_with name: "dhh", password: "secret", only: :destroy
     
      def create
        @article = Article.find(params[:article_id])
        @comment = @article.comments.create(comment_params)
        redirect_to article_path(@article)
      end
     
      def destroy
        @article = Article.find(params[:article_id])
        @comment = @article.comments.find(params[:id])
        @comment.destroy
        redirect_to article_path(@article)
      end
     
      private
        def comment_params
          params.require(:comment).permit(:commenter, :body)
        end
    end
    

    下面是该控制器类所包含的方法以及它们所对应的路由

    • create(创建)PATCH/POST /articles/:article_id/comments
    • destroy(删除)DELETE /articles/:article_id/comments/:id

    welcome 视图代码

    app/views/welcome/index.html.erb 文件

    <h1>Hello, Rails!</h1>
    <%= link_to 'My Blog', controller: 'articles' %>
    

    articles 视图代码

    app/views/articles/_form.html.erb 文件

    <%= form_with model: @article, local: true do |form| %>
    
      <% if @article.errors.any? %>
        <div id="error_explanation">
          <h2>
            <%= pluralize(@article.errors.count, "error") %> prohibited
            this article from being saved:
          </h2>
          <ul>
            <% @article.errors.full_messages.each do |msg| %>
              <li><%= msg %></li>
            <% end %>
          </ul>
        </div>
      <% end %>
    
      <p>
        <%= form.label :title %><br>
        <%= form.text_field :title %>
      </p>
    
      <p>
        <%= form.label :text %><br>
        <%= form.text_area :text %>
      </p>
    
      <p>
        <%= form.submit %>
      </p>
    
    <% end %>
    

    app/views/articles/edit.html.erb 文件

    <h1>Edit article</h1>
    
    <%= render 'form' %>
    
    <%= link_to 'Back', articles_path %>
    

    app/views/articles/index.html.erb 文件

    <h1>Listing articles</h1>
    
    <%= link_to 'New article', new_article_path %>
    
    <table>
      <tr>
        <th>Title</th>
        <th>Text</th>
        <th></th>
      </tr>
    
      <% @articles.each do |article| %>
        <tr>
          <td><%= article.title %></td>
          <td><%= article.text %></td>
          <td><%= link_to 'Show', article_path(article) %></td>
          <td><%= link_to 'Edit', edit_article_path(article) %></td>
          <td><%= link_to 'Destroy', article_path(article),
                          method: :delete,
                          data: { confirm: 'Are you sure?' } %></td>
        </tr>
      <% end %>
    </table>
    

    app/views/articles/new.html.erb 文件

    <h1>New article</h1>
    
    <%= render 'form' %>
    
    <%= link_to 'Back', articles_path %>
    

    app/views/articles/show.html.erb 文件

    <p>
      <strong>Title:</strong>
      <%= @article.title %>
    </p>
     
    <p>
      <strong>Text:</strong>
      <%= @article.text %>
    </p>
     
    <h2>Comments</h2>
    <%= render @article.comments %>
     
    <h2>Add a comment:</h2>
    <%= render 'comments/form' %>
     
    <%= link_to 'Edit', edit_article_path(@article) %> |
    <%= link_to 'Back', articles_path %>
    

    comments 视图代码

    app/views/articles/_comment.html.erb 文件

    <p>
      <strong>Commenter:</strong>
      <%= comment.commenter %>
    </p>
     
    <p>
      <strong>Comment:</strong>
      <%= comment.body %>
    </p>
     
    <p>
      <%= link_to 'Destroy Comment', [comment.article, comment],
                   method: :delete,
                   data: { confirm: 'Are you sure?' } %>
    </p>
    

    app/views/articles/_form.html.erb 文件

    <%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %>
      <p>
        <%= form.label :commenter %><br>
        <%= form.text_field :commenter %>
      </p>
      <p>
        <%= form.label :body %><br>
        <%= form.text_area :body %>
      </p>
      <p>
        <%= form.submit %>
      </p>
    <% end %>
    

    参考链接

    Ruby on Rails

  • 相关阅读:
    关于线程池的线程复用
    Java线程锁之意难平的读写锁
    Java8之StringJoiner
    springboot整合thymeleaf
    一维数组转二叉树、注解回滚、eclipse配置代码自动补全
    Java之线程锁
    关于工作中的一些总结
    关于shiro的猜测
    Java之扫描不到mapper
    网页中引用css样式
  • 原文地址:https://www.cnblogs.com/zwvista/p/10331477.html
Copyright © 2020-2023  润新知