zwvista

导航

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

posted on 2019-01-28 19:23  zwvista  阅读(214)  评论(0编辑  收藏  举报