iT邦幫忙

DAY 25
1

從想法到快速實作的捷徑:Rails系列 第 25

[ Day 25 ][ Dev ] 實作角色權限管理 - Part 3

  • 分享至 

  • xImage
  •  

下來我們就是要完成po文的發佈功能:

  • 經過admin發佈的文章才能出現在公開的頁面上

再拆下去:

  • 經過admin發佈的文章才能出現在公開的頁面上
  • 發佈文章時會預設未發佈
  • 後台能發佈文章
  • 使用者能看到自己的發文(不管有沒有發佈)

要拆的更細也可以,不過我通常這時候就會開始動工啦!

  1. 發佈文章

  • 先在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

再來就是到後台去發佈文章啦!

  • 跟前一篇的做法會有點相似
  1. 新增發佈方法
  2. 新增route和controller action
  3. 在view加上(admin/posts#index)

因為過程太類似了就直接看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>
  1. 使用者能看到自己發布的文章

這裏要回到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來解決了。


上一篇
[ Day 24 ][ Dev ] 實作角色權限管理 - Part 2
下一篇
[ Day 26 ][ Dev ] 上傳圖片 - Carrierwave
系列文
從想法到快速實作的捷徑:Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言