2014-02-24 27 views
1

我正在嘗試構建一個簡單的網站,用戶可以在其中撰寫文章,但管理員需要在他們出現在網站上之前批准它們。此外,用戶創建文章後,文章不會立即發送到管理員。用戶首先需要點擊文章屬性上的按鈕「發送」。更新同一表的多個用戶級別

我有這樣的模式:

create_table "articles", force: true do |t| 
    t.string "title" 
    t.text  "content" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.boolean "published", default: false 
    t.boolean "sent",  default: false 
end 

用戶創建的文章,publishedsent都是假的之後。在文章屬性用戶有「發送」按鈕。在他點擊該按鈕後,published仍然是錯誤的,但sent現在成立。現在在管理控制面板中,管理員看到新文章,當他點擊「發佈」按鈕時,publishedsent現在都成立。上傳文章的用戶可以刪除文章並將published設置爲false。

所有動作我這樣做,例如:

<%= link_to 'Undo sent', article_path(article, :article => {:sent => false}), :method => :put %> 

問題是我不知道如何來限制訪問。普通用戶可以將列sent更改爲true和false,但是列published他只能更改爲false。只有管​​理員可以將列published更改爲true和false。

我該如何在我的控制器內完成這項工作,以確保它安全?所有用戶都有我可以訪問的角色列。謝謝。

+1

使用慘慘的權限;) – MrYoshiji

+0

@MrYoshiji,我已經擁有了一切。我不需要CanCan :)這可能只是一個小問題。 – user3339562

回答

0

你需要使用像一個state machine

#app/models/article.rb 
Class Article < ActiveRecord::Base 
    state_machine :initial => :pending do 

    #States 
    state :draft 
    state :pending do 
     validates :title, :body, 
      presence: { message: "Needs A Value!" } 
    end 
    state :queued 
    state :sent 
    state :error 

    #Publish 
    event :publish do 
     transition :draft => :pending, :if => :valid_user 
    end 

    #Queued 
    event :queue do 
     transition :pending => :queued, :if => :valid_user 
    end 

    #Sent 
    event :sent do 
     transition :queued => :sent, :if => :valid_user 
    end 

    #Error 
    event :error do 
     transition all => :error, :if => :valid_user 
    end 
end 
end 

然後可以使用this for the permissions(使用示例代碼):

def valid_user 
    if User.current_user.has_role?(xyz) 
    do baa 
    end 
end