下來我們就是要完成po文的發佈功能:
再拆下去:
要拆的更細也可以,不過我通常這時候就會開始動工啦!
先在user裡面新增一個publish欄位,預設是false
接著在posts#index的地方將所有publish為true的文章顯示出來,這裡我們會在model裡面用到scope
scope :published, -> {where(publish: true)}
這樣我們只要呼叫Post.published就能拿到publish為true的post了!
(跟Post.where(publish: true)是等價的,只是這樣比較好看也比較好維護)
接著把所有有呼叫到post的地方都加上去這個scope,
比較特別的是tag的地方要這樣做:
def index
if params[:tag]
@posts = Post.tagged_with(params[:tag]).published
else
@posts = Post.published
end
end
再來就是到後台去發佈文章啦!
因為過程太類似了就直接看code吧
class Admin::Post < Post
def toggle_publish!
self.publish = !self.publish
end
end
namespace :admin do
resources :posts do
collection do
put :toggle_publish
end
end
resources :users do
collection do
put :toggle_admin
end
end
end
def toggle_publish
params[:post_ids] = params[:post_ids].map{|i| i.to_i}
@admin_posts = Admin::Post.find(params[:post_ids])
@admin_posts.each do |post|
post.toggle_publish!
post.save
end
redirect_to admin_posts_path
end
<%= form_tag(toggle_publish_admin_posts_path, method: 'put') do %>
...
<% @admin_posts.each do |post| %>
<tr>
<td><%= check_box_tag "post_ids[]", post.id %></td>
<td><%= post.publish %></td>
這裏要回到posts_controller.rb,去新增一個method(action)
def my_posts
@posts = Post.where(user_id: current_user.id).page(params[:page]) #後面page部分是分頁
end
意思很簡單,就是指定只能看到user_id是指向目前登入user的po文。
* current_user 是devise提供的helper
再來就是在routes.rb新增路徑。
(其實做久會發現都是這幾個routing在跑,convention over configuration對吧?)
get 'posts/my_posts', to: 'posts#my_posts'
再來只要在頁面新增一個連結就可以跳過去看啦
<%= link_to 'My posts', my_posts_path %>
跳過去那一頁之後可以用你喜歡的方式處理我們在controller裡設定好的posts。
最後,也是最常忘記的,
記得在ability.rb裡面用cancancan做一下權限管理:
can :my_posts, Post do |post|
(post.user_id == user.id)
end
權限管理大概就到這裡結束啦!
現在已經會了許多基本的用法,度過最一開始的撞牆期,
之後再困難一些的設定都有辦法自己去survey來解決了。