5-1 本章目標(biāo)
- 安裝“會(huì)員系統(tǒng)”(使用 devise)
- 在 navbar 安裝登錄/退出按鈕
- 只有登錄了的使用者,才可以建立群組
- 只有群組的建立者,才可以 編輯 / 刪除群組
5-2 安裝 devise gem
先創(chuàng)建分支
git checkout -b ch04
1: 安裝登錄系統(tǒng)
Gemfile 新增一行gem 'devise'
, 然后bundle install
2 : 產(chǎn)生會(huì)員系統(tǒng)的必要文件
執(zhí)行
rails g devise:install
rails g devise user
rake db:migrate
之后 重開 rails s3: 在 groups_controller 限制 “新增討論群”必須先登錄
# app/controllers/groups_controller.rb
class GroupsController < ApplicationController
before_action :authenticate_user! , only: [:new]
- 4: git 存檔
5-3 讓這個(gè)網(wǎng)站有實(shí)際“登錄”刚盈、“退出”的功能
讓右上角的“登錄”可以實(shí)際有:“登錄” / “退出的效果”
- 1: 修改 app/views/common/_navbar.html.erb
# app/views/common/_navbar.html.erb
- <li>
- <%= link_to("登錄", '#') %>
- </li>
+ <% if !current_user %>
+ <li><%= link_to("注冊(cè)", new_user_registration_path) %> </li>
+ <li><%= link_to("登錄", new_user_session_path) %></li>
+ <% else %>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+ Hi!, <%= current_user.email %>
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li> <%= link_to("退出", destroy_user_session_path, method: :delete) %> </li>
+ </ul>
+ </li>
+ <% end %>
- 2: 修改
app/assets/javascripts/application.js
# app/assets/javascripts/application.js
//= require bootstrap/alert
+ //= require bootstrap/dropdown
- 3: git 儲(chǔ)存
5-4 讓“群組”與“使用者”產(chǎn)生關(guān)聯(lián)
- 1: 新增 user_id 到 group 的 table 里
執(zhí)行rails g migration add_user_id_to_group
然后打開剛剛新增的 migration 檔分扎,修改讓它長(zhǎng)得像這樣
# db/migrate/一串?dāng)?shù)字_add_user_id_to_group
class AddUserIdToGroup < ActiveRecord::Migration[5.0]
def change
add_column :groups, :user_id, :integer
end
end
接著執(zhí)行rake db: migrate
- 2: 連結(jié) user 與 group 的雙向關(guān)系
修改 app/models/user.rb 加入 has_many :groups
# app/models/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :groups
end
修改 app/models/group.rb 加入 belongs_to :user
# app/models/group.rb
class Group < ApplicationRecord
belongs_to :user
validates :title, presence: true
end
- 3: 在新增看板時(shí),記錄誰是群組的建立者
修改app/controllers/groups_controller.rb
,在需要“登入驗(yàn)證”的 action 列表再加入 create。
# app/controllers/groups_controller.rb
class GroupsController < ApplicationController
before_action :authenticate_user! , only: [:new, :create]
修改 app/controllers/groups_controller.rb
,在 create 中骨杂,多加入一行 @group.user = current_user
,變成以下內(nèi)容:
# app/controllers/groups_controller.rb
def create
@group = Group.new(group_params)
@group.user = current_user
if @group.save
redirect_to groups_path
else
render :new
end
end
4 : git 儲(chǔ)存
5 : 修改 group 列表,將 user 的名字列上去
修改app/views/groups/index.html.erb
然后把 Creator 的信息加進(jìn)去雄卷。(代碼如下)
app/views/groups/index.html.erb
<div class="col-md-12">
<div class="group">
<%= link_to("New group", new_group_path, class: "btn btn-primary pull-right") %>
</div>
<table class="table table-hover">
<thead>
<tr>
<td>#</td>
<td>Title</td>
<td>Description</td>
+ <td>Creator </td>
</tr>
</thead>
<tbody>
<% @groups.each do |group| %>
<tr>
<td>#</td>
<td><%= link_to(group.title, group_path(group)) %></td>
<td><%= group.description %></td>
+ <td> <%= group.user.email %> </td>
<td>
<%= link_to("Edit", edit_group_path(group), class: "btn btn-sm btn-default")%>
<%= link_to("Delete", group_path(group), class: "btn btn-sm btn-default",
method: :delete, data: { confirm: "Are you sure?" } )%>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
做完之后搓蚪,打開 http://localhost:3000/ 會(huì)發(fā)現(xiàn),首頁(yè)怎么爆炸了丁鹉。
別擔(dān)心妒潭,這是因?yàn)槲覀冎皠?chuàng)造的“群組”都是“無主”的。只要把這些“無主”的群組揣钦,通通刪掉就行了雳灾。
6: 刪除所有“無主”的群組
執(zhí)行rails console
然后輸入Group.delete_all
輸入exit
退出 console然后再打開 http://localhost:3000/ 就正常了。7 : git 存檔
5-5 只有群組的“創(chuàng)始者”可以“編輯”“刪除”群組資訊
- 1: 路人不應(yīng)該可以看到“編輯”“刪除”按鈕
根據(jù)邏輯 只有登入模式下
而且還必須是群組“創(chuàng)始者”
才能看得到這個(gè)兩個(gè)按鈕冯凹,否則路人是看不到的谎亩。
app/views/groups/index.html.erb
<td>
+ <% if current_user && current_user == group.user %>
<%= link_to("Edit", edit_group_path(group), class: "btn btn-sm btn-default")%>
<%= link_to("Delete", group_path(group), class: "btn btn-sm btn-default",
method: :delete, data: { confirm: "Are you sure?" } )%>
+ <% end %>
</td>
重新刷新首頁(yè),路人現(xiàn)在就看不到按鈕了。接著 git 保存匈庭。
- 3: 路人不應(yīng)該也可以“直接輸入網(wǎng)址”去存取 edit / update / destroy action
除了將按鈕對(duì)路人隱藏外夫凸,我們還要考慮到一個(gè)情形,假設(shè)這個(gè)路人是知道 Rails 規(guī)則的阱持,那么他可能輸入http://localhost:3000/groups/某筆數(shù)據(jù)的ID/edit
網(wǎng)址夭拌,就直接可以編輯數(shù)據(jù)。
我們也要在 controller 做權(quán)限判斷衷咽,濾掉這種人鸽扁。
首先,我們先限定 edit / update / destroy
這三個(gè)操作動(dòng)作镶骗,必須要是“登入”的使用者才能存取桶现。
# app/controllers/groups_controller.rb
class GroupsController < ApplicationController
before_action :authenticate_user! , only: [:new, :create, :edit, :update, :destroy]
- 4: 必須要是 group 擁有人,才能進(jìn)入 edit卖词,否則會(huì)被重導(dǎo)至首頁(yè)巩那,并顯示錯(cuò)誤信息吏夯。
修改app/controllers/groups_controller.rb
加入權(quán)限此蜈,如果不是“創(chuàng)始者”去存取,會(huì)顯示沒有權(quán)限的錯(cuò)誤信息噪生。
# app/controllers/groups_controller.rb
def edit
@group = Group.find(params[:id])
if current_user != @group.user
redirect_to root_path, alert: "You have no permission."
end
end
這樣當(dāng)其他人裆赵,試圖輸入http://localhost:3000/groups/某筆數(shù)據(jù)的ID/edit
這樣的網(wǎng)址,想要編輯數(shù)據(jù)跺嗽,就會(huì)被擋住战授。
5: 依樣畫葫蘆的把“權(quán)限檢查”的代碼,套用到 update / destroy 上
6: git 存檔
7: 制作
find_group_and_check_permission
我們發(fā)現(xiàn) edit桨嫁、update植兰、destroy 這三個(gè) action 都有一樣的代碼,看起來有點(diǎn)冗璃吧。
@group = Group.find(params[:id])
if current_user != @group.user
redirect_to root_path, alert: "You have no permission."
end
其實(shí)我們可以透過把它包裝成一個(gè)函式的方式 find_group_and_check_permission
去省略這段冗余代碼楣导。
打開 app/controllers/groups_controller.rb
在 private 下,新增一個(gè) find_group_and_check_permission
# app/controllers/groups_controller.rb
private
def find_group_and_check_permission
@group = Group.find(params[:id])
if current_user != @group.user
redirect_to root_path, alert: "You have no permission."
end
end
def group_params
params.require(:group).permit(:title, :description)
end
end
再修正 edit
# app/controllers/groups_controller.rb
def edit
find_group_and_check_permission
end
修正 update
# app/controllers/groups_controller.rb
def update
find_group_and_check_permission
if @group.update(group_params)
redirect_to groups_path, notice: "Update Success"
else
render :edit
end
end
修正 destroy
# app/controllers/groups_controller.rb
def destroy
find_group_and_check_permission
@group.destroy
redirect_to groups_path, alert: "Group deleted"
end
- 8: 把
find_group_and_check_permission
掛到before_action
開發(fā)到這里你會(huì)發(fā)現(xiàn)一件事畜挨,find_group_and_check_permission
其實(shí)都是在這三個(gè) action 的最前面開頭執(zhí)行的筒繁,所以你甚至可以這樣寫,把find_group_and_check_permission
掛到before_action
# app/controllers/groups_controller.rb
class GroupsController < ApplicationController
before_action :authenticate_user! , only: [:new, :create, :edit, :update, :destroy]
before_action :find_group_and_check_permission, only: [:edit, :update, :destroy]
然后再把 edit update destroy
里的 find_group_and_check_permission
砍掉巴元。變成這樣:
# app/controllers/groups_controller.rb
def edit
end
def update
if @group.update(group_params)
redirect_to groups_path, notice: "Update Success"
else
render :edit
end
end
def destroy
@group.destroy
redirect_to groups_path, alert: "Group deleted"
end
9: git 存檔
10 : 修掉 show 里面的 Edit 按鈕
做到這里毡咏,我們還發(fā)現(xiàn)一個(gè)地方,我們漏了改逮刨,那就是show.html.erb
上面呕缭,還有一個(gè) Edit 按鈕我們還沒有拔掉。
app/views/groups/show.html.erb
<div class="group">
<% if current_user && current_user == @group.user %>
<%= link_to("Edit", edit_group_path(@group), class: "btn btn-primary pull-right")%>
<% end %>
</div>
- 11: git 存檔
6-1 本章目標(biāo)
可以在群組里面新增 / 編輯 / 刪除文章
文章必須要有“內(nèi)容”,否則不允許被發(fā)表
6-2 建立文章的架構(gòu)
git checkout -b ch05
- 設(shè)計(jì) Post 的 model 架構(gòu)
rails g model post content:text group_id:integer user_id:integer
rake db:migrate
- 設(shè)計(jì) Post 的 model 架構(gòu)
- 建立 Group / Post / User 三者間的關(guān)系
Group has_many posts
- 建立 Group / Post / User 三者間的關(guān)系
# app/models/group.rb
class Group < ApplicationRecord
belongs_to :user
has_many :posts
validates :title, presence: true
end
User has_many posts
# app/models/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :groups
has_many :posts
end
Post belongs_to User
Post belongs_to Group
# app/models/post.rb
class Post < ApplicationRecord
belongs_to :user
belongs_to :group
end
- git 存檔
- 建立 Post Controller
rails g controller posts
- 建立 Post Controller
- 設(shè)立 routing
修改config/routes.rb
將resources :posts
加入resources :groups
內(nèi)恢总。
- 設(shè)立 routing
# config/routes.rb
Rails.application.routes.draw do
devise_for :users
resources :groups do
resources :posts
end
root 'groups#index'
end
之后 rake routes
然后你就會(huì)發(fā)現(xiàn)落恼, routing 列表內(nèi)產(chǎn)生了 /groups/:group_id/posts/new
這樣的網(wǎng)址支援。
- git 存檔
- 在 groups#show 新增 “發(fā)表文章”按鈕,加入一行
# app/views/groups/show.html.erb
<%= link_to("Write a Post", new_group_post_path(@group), class: "btn btn-default pull-right")%>
- git 存檔
6-3 實(shí)際發(fā)表文章
實(shí)際把文章發(fā)在群里面
使用者可以在群里面看到文章一覽表
- 1: 實(shí)作 new / create action
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
before_action :authenticate_user!, :only => [:new, :create]
def new
@group = Group.find(params[:group_id])
@post = Post.new
end
def create
@group = Group.find(params[:group_id])
@post = Post.new(post_params)
@post.group = @group
@post.user = current_user
if @post.save
redirect_to group_path(@group)
else
render :new
end
end
private
def post_params
params.require(:post).permit(:content)
end
end
- 新增
app/views/posts/new.html.erb
- 新增
# app/views/posts/new.html.erb
<h2 class="text-center">新增文章</h2>
<div class="col-md-4 col-md-offset-4">
<%= simple_form_for [@group,@post] do |f| %>
<div class="form-group">
<%= f.input :content, input_html: { class: "form-control"} %>
</div>
<div class="form-actions">
<%= f.submit "Submit", disable_with: "Submiting...", class: "btn btn-primary"%>
</div>
<% end %>
</div>
- 修改 groups_controller 中的 show action
# app/controllers/groups_controller.rb
def show
@group = Group.find(params[:id])
@posts = @group.posts
end
- 修改 groups/show.html.erb
我們要修改app/views/groups/show.html.erb
离熏,讓文章能夠顯示出來佳谦,在<%= @group.description %>
下,我們多加了一個(gè)表格做這件事滋戳。
- 修改 groups/show.html.erb
# app/views/groups/show.html.erb
...(略)
<p><%= @group.description %></p>
+ <table class="table">
+ <thead>
+ <tr>
+ <th>文章內(nèi)容</th>
+ <th>發(fā)表者</th>
+ <th>發(fā)表時(shí)間</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% @posts.each do |post| %>
+ <tr>
+ <td><%= post.content %></td>
+ <td><%= post.user.email %></td>
+ <td><%= post.created_at %></td>
+ </tr>
+ <% end %>
+ </tbody>
+ </table>
- 5: 對(duì) Post 加上 validation
這時(shí)候我們發(fā)現(xiàn)钻蔑,剛剛有文章不小心沒填內(nèi)容,就發(fā)出去變成空的奸鸯。
為了防止這樣的情形咪笑,我們還是要限制 post 的 content 要是為空,就不得送出娄涩。
# app/models/post.rb
class Post < ApplicationRecord
belongs_to :user
belongs_to :group
validates :content, presence: true
end
- git 存檔
6-4 文章應(yīng)該按照發(fā)表時(shí)間倒序排列
- 修改 groups_controller
app/controllers/groups_controller.rb
def show
@group = Group.find(params[:id])
@posts = @group.posts.order("created_at DESC")
end
- 使用 scope 替代直接 order
這里的 order("created_at DESC") 是“程序語(yǔ)句”窗怒,但不是“功能敘述”。我們作為旁觀者蓄拣,只能猜測(cè)這是要按照“最近的時(shí)序排列”扬虚。
- 使用 scope 替代直接 order
如果能改成 @group.posts.recent 可能在維護(hù)性上更直觀。
這里我們還可以用 Rails 里面的一個(gè)內(nèi)建 API scope 讓代碼更直觀一些球恤。
修改app/models/post.rb
辜昵,加入一行 scope :recent, -> { order("created_at DESC")}
# app/models/post.rb
class Post < ApplicationRecord
# ... 略
scope :recent, -> { order("created_at DESC")}
end
然后修改 app/controllers/groups_controller.rb
中的 show
# app/controllers/groups_controller.rb
def show
@group = Group.find(params[:id])
@posts = @group.posts.recent
end
- git 儲(chǔ)存
6-5 加入文章分頁(yè)功能
1: 安裝 will_paginate
gem 'will_paginate'
bundle install
rails s
2: 修改 groups_controller
# app/controllers/groups_controller.rb
def show
@group = Group.find(params[:id])
@posts = @group.posts.recent.paginate(:page => params[:page], :per_page => 5)
end
- 3: 修改 groups/show.html.erb
</tbody>
</table>
+ <div class="text-center">
+ <%= will_paginate @posts %>
+ </div>
- 4: git 儲(chǔ)存
7-1 本章目標(biāo)
一個(gè)使用者可以選擇“加入”、“退出”討論群
群的創(chuàng)始者咽斧,創(chuàng)群一開始就應(yīng)該加在群組里
7-2 建立“群成員”數(shù)據(jù)表
git checkout -b ch06
1: 建立 GroupRelationship
輸入rails g model group_relationship group_id:integer user_id:integer
執(zhí)行rake db:migrate
2: 設(shè)定 Group 與 User 之間的關(guān)系 ( 使用者參與的所有群)
首先堪置,修改app/models/user.rb
加入以下兩行
# app/models/user.rb
class User < ApplicationRecord
# .. 略
+ has_many :group_relationships
+ has_many :participated_groups, :through => :group_relationships, :source => :group
end
然后修改 app/models/group_relationship.rb
,加入這兩行
# app/models/group_relationship.rb
class GroupRelationship < ApplicationRecord
+ belongs_to :group
+ belongs_to :user
end
這樣當(dāng)撈 user.participated_groups
時(shí)张惹,就會(huì)撈出“參與的所有群”舀锨。
- 3: 設(shè)定 Group 與 User 之間的關(guān)系 ( 群組內(nèi)的所有會(huì)員 )
# app/models/group.rb
class Group < ApplicationRecord
# ... 略
+ has_many :group_relationships
+ has_many :members, through: :group_relationships, source: :user
end
- 4: 動(dòng)手測(cè)看看
打開rails console
依次輸入
u = User.first
g = Group.first
g.members << u
g.members
u.participated_groups # 看看會(huì)出現(xiàn)什么結(jié)果,最后執(zhí)行exit退出
- 5: git 儲(chǔ)存
7-3 在群組里面判斷“是否群組成員”實(shí)作
- 在 user model 內(nèi)實(shí)作判斷式“是否為群組的一分子”
# app/models/user.rb
class User < ApplicationRecord
# 略 ...
+ def is_member_of?(group)
+ participated_groups.include?(group)
+ end
end
然后“重開” rails console
依次輸入
u = User.first
g = Group.first
u.is_member_of?(g)
觀察結(jié)果
- 修改 groups/show.html.erb
app/views/groups/show.html.erb
<span class="pull-right">
<% if current_user && current_user.is_member_of?(@group) %>
<label class="label label-success"> 群組成員 </label>
<% else %>
<label class="label label-warning"> 不是群組成員 </label>
<% end %>
</span>
- git 存檔
7-4 “加入群組”或“退出群組”
實(shí)作 model 層 “加入群組”
實(shí)作 model 層“退出群組”
# app/models/user.rb
def join!(group)
participated_groups << group
end
def quit!(group)
participated_groups.delete(group)
end
打開 rails console
終端依次輸入
u = User.first
g = Group.first
u.join!(g)
u.is_member_of?(g)
u.quit!(g)
u.is_member_of?(g)
exit # 觀察結(jié)果, 記得 git
7-5 實(shí)際操作“加入群組”或“退出群組”
app/controllers/groups_controller.rb
+ def join
+ @group = Group.find(params[:id])
+
+ if !current_user.is_member_of?(@group)
+ current_user.join!(@group)
+ flash[:notice] = "加入本討論版成功!"
+ else
+ flash[:warning] = "你已經(jīng)是本討論版成員了宛逗!"
+ end
+
+ redirect_to group_path(@group)
+ end
+
+ def quit
+ @group = Group.find(params[:id])
+
+ if current_user.is_member_of?(@group)
+ current_user.quit!(@group)
+ flash[:alert] = "已退出本討論版坎匿!"
+ else
+ flash[:warning] = "你不是本討論版成員,怎么退出 XD"
+ end
+
+ redirect_to group_path(@group)
+ end
private
加入與退出群組必須要是登入狀態(tài)下才行拧额,修改位於第二行的 before_action 碑诉,加入 join 和 quit 也需要驗(yàn)證
app/controllers/groups_controller.rb
class GroupsController < ApplicationController
- before_action :authenticate_user! , only: [:new, :create, :edit, :update, :destroy]
+ before_action :authenticate_user! , only: [:new, :create, :edit, :update, :destroy, :join, :quit]
...
# config/routes.rb
resources :groups do
+ member do
+ post :join
+ post :quit
+ end
resources :posts
end
# app/views/groups/show.html.erb
<span class="pull-right">
<% if current_user && current_user.is_member_of?(@group) %>
<label class="label label-success"> 群組成員 </label>
+ <%= link_to("Quit Group", quit_group_path(@group), method: :post, class: "btn btn-default") %>
<% else %>
<label class="label label-warning"> 不是群組成員 </label>
+ <%= link_to("Join Group", join_group_path(@group), method: :post, class: "btn btn-default") %>
<% end %>
</span>
最后 git 保存
7-6 User 在建立 group 后自動(dòng)成為 group 的一員
app/controllers/groups_controller.rb
def create
@group = Group.new(group_params)
@group.user = current_user
if @group.save
+ current_user.join!(@group)
redirect_to groups_path
else
render :new
end
end
還得記得 git 保存
8-使用者可以在“自己的后臺(tái)”看過曾經(jīng)發(fā)表的文章、以及創(chuàng)立的社團(tuán)
新增一個(gè)下拉選單
可以看到自己過去曾經(jīng)發(fā)表的文章
可以看到自己過去曾經(jīng)參與的社團(tuán)
8-2 可以看到自己參與的所有群組
git checkout -b ch07
1: 產(chǎn)生 account 的 namespace 下的 groups_controller
rails g controller account/groups
- 修改 routing
config/routes.rb
namespace :account do
resources :groups
end
- 3: 修改下拉選項(xiàng)
# app/views/common/_navbar.html.erb
<ul class="dropdown-menu">
+ <li> <%= link_to("My Groups", account_groups_path) %></li>
+ <li class="divider"> </li>
<li> <%= link_to("退出", destroy_user_session_path, method: :delete) %> </li>
</ul>
- 建立
account/groups_controller.rb
下的 index action
- 建立
app/controllers/account/groups_controller.rb
class Account::GroupsController < ApplicationController
before_action :authenticate_user!
def index
@groups = current_user.participated_groups
end
end
- 新增 “參與群組一覽表”
app/views/account/groups/index.html.erb
<div class="col-md-12">
<h2 class="text-center"> 我加入的討論版 </h2>
<table class="table">
<thead>
<tr>
<th> # </th>
<th> Title </th>
<th> Description </th>
<th> Post Count </th>
<th> Last Update </th>
</tr>
</thead>
<tbody>
<% @groups.each do |group| %>
<tr>
<td> # </td>
<td> <%= link_to(group.title, group_path(group)) %> </td>
<td> <%= group.description %> </td>
<td> <%= group.posts.count %> </td>
<td> <%= group.updated_at %> </td>
</tr>
<% end %>
</tbody>
</table>
</div>
- 6: git 儲(chǔ)存
8-3 可以看到自己發(fā)表的所有文章
使用者在下拉選單內(nèi)侥锦,可以看到 "My Posts"
使用者點(diǎn)選 "My Posts" 可以看到自己發(fā)表的所有文章
1: 產(chǎn)生 account 的 namespace 下的 posts_controller
rails g controller account/posts
- 建立
account/posts_controller.rb
下的 index action
- 建立
# app/controllers/account/posts_controller.rb
class Account::PostsController < ApplicationController
before_action :authenticate_user!
def index
@posts = current_user.posts
end
end
- 修改 routing
config/routes.rb
namespace :account do
resources :groups
+ resources :posts
end
- 4: 修改下拉選項(xiàng)
# app/views/common/_navbar.html.erb
<ul class="dropdown-menu">
<li> <%= link_to("My Groups", account_groups_path) %></li>
+ <li> <%= link_to("My Posts", account_posts_path) %></li>
<li class="divider"> </li>
<li> <%= link_to("退出", destroy_user_session_path, method: :delete) %> </li>
</ul>
- 新增 “發(fā)表文章一覽表”
# app/views/account/posts/index.html.erb
<div class="col-md-12">
<h2 class="text-center"> 我發(fā)表過的文章 </h2>
<table class="table">
<thead>
<tr>
<th> Content </th>
<th> Group Name </th>
<th> Last Update </th>
<th colspan="2"></th>
</tr>
</thead>
<tbody>
<% @posts.each do |post| %>
<tr>
<td> <%= post.content %> </td>
<td> <%= post.group.title %> </td>
<td> <%= post.updated_at %> </td>
<td> <%= link_to('Edit', edit_group_post_path(post.group, post), class: "btn btn-default btn-xs") %></td>
<td> <%= link_to('Delete', group_post_path(post.group, post), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-default btn-xs") %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
- 6: git 儲(chǔ)存
9-修飾細(xì)節(jié)进栽,使用 Helper 與 Partial
暫略