Ruby on Rails 开发笔记
安装 Ruby on Rails
- 安装 ruby
RubyInstall for Windows - 安装 sqlite
SQLite Download Page
下载 sqlite-tools-win32-x86-......zip - 安装 rails
gem install rails
创建应用
MacOS 平台
# 创建新的应用程序
$ rails new blog
$ cd blog
# 安装 yarn
$ brew install yarn
# 安装 webpacker
$ rails webpacker:install
# 启动服务器
$ rails server
# http://localhost:3000 可访问网页
Windows 平台
- 创建新的应用程序
- 安装 yarn
- 安装 node
- 安装 webpacker
官方示例
控制器生成器
使用 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 %>