rails101再?gòu)?fù)盤-2

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 s

  • 3: 在 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

    1. 設(shè)計(jì) Post 的 model 架構(gòu)
      rails g model post content:text group_id:integer user_id:integer
      rake db:migrate
    1. 建立 Group / Post / User 三者間的關(guān)系
      Group has_many posts
# 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
    1. git 存檔
    1. 建立 Post Controller
      rails g controller posts
    1. 設(shè)立 routing
      修改 config/routes.rb
      resources :posts 加入 resources :groups 內(nèi)恢总。
# 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)址支援。

    1. git 存檔
    1. 在 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")%>
    1. 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
    1. 新增 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>
    1. 修改 groups_controller 中的 show action
# app/controllers/groups_controller.rb
  def show
    @group = Group.find(params[:id])
    @posts = @group.posts
  end
    1. 修改 groups/show.html.erb
      我們要修改app/views/groups/show.html.erb离熏,讓文章能夠顯示出來佳谦,在<%= @group.description %>下,我們多加了一個(gè)表格做這件事滋戳。
# 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
    1. git 存檔

6-4 文章應(yīng)該按照發(fā)表時(shí)間倒序排列

    1. 修改 groups_controller
app/controllers/groups_controller.rb
  def show
    @group = Group.find(params[:id])
    @posts = @group.posts.order("created_at DESC")
  end
    1. 使用 scope 替代直接 order
      這里的 order("created_at DESC") 是“程序語(yǔ)句”窗怒,但不是“功能敘述”。我們作為旁觀者蓄拣,只能猜測(cè)這是要按照“最近的時(shí)序排列”扬虚。

如果能改成 @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
    1. 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í)作

    1. 在 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é)果

    1. 修改 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>
    1. 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

    1. 修改 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>
    1. 建立 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
    1. 新增 “參與群組一覽表”
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

    1. 建立 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
    1. 修改 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>
    1. 新增 “發(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

暫略

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恭垦,隨后出現(xiàn)的幾起案子快毛,更是在濱河造成了極大的恐慌格嗅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唠帝,死亡現(xiàn)場(chǎng)離奇詭異屯掖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)襟衰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門贴铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瀑晒,你說我怎么就攤上這事绍坝。” “怎么了苔悦?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵轩褐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我玖详,道長(zhǎng)把介,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任蟋座,我火速辦了婚禮拗踢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜈七。我一直安慰自己秒拔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布飒硅。 她就那樣靜靜地躺著,像睡著了一般作谚。 火紅的嫁衣襯著肌膚如雪三娩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天妹懒,我揣著相機(jī)與錄音雀监,去河邊找鬼。 笑死眨唬,一個(gè)胖子當(dāng)著我的面吹牛会前,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匾竿,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼瓦宜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了岭妖?” 一聲冷哼從身側(cè)響起临庇,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤反璃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后假夺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淮蜈,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年已卷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梧田。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侧蘸,死狀恐怖柿扣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闺魏,我是刑警寧澤未状,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站析桥,受9級(jí)特大地震影響司草,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泡仗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一埋虹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娩怎,春花似錦搔课、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至崩瓤,卻和暖如春袍啡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背却桶。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工境输, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颖系。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓嗅剖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嘁扼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子信粮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容