【问题标题】:Multiple user levels for updating same table用于更新同一个表的多个用户级别
【发布时间】:2014-02-24 21:22:26
【问题描述】:

我正在尝试建立一个简单的网站,用户可以在其中撰写文章,但需要管理员批准才能显示在网站上。此外,用户创建文章后,文章不会立即发送给管理员。用户首先需要点击文章属性上的“发送”按钮。

我有这个模型:

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 为 false。在文章属性中,用户有“发送”按钮。在他单击该按钮后,published 仍然为 false,但 sent 现在为 true。现在在管理员控制面板中,管理员看到了新文章,当他点击“发布”按钮时,publishedsent 现在都是 true。上传文章的用户可以删除文章并将published设置为false。

我正在执行的所有操作例如:

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

问题是我不知道如何限制访问。普通用户可以将列sent 更改为true 和false,但列published 他只能更改为false。只有管​​理员可以将列 published 更改为 true 和 false。

我怎样才能在我的控制器内完成它以确保它的安全?所有用户都有我可以访问的角色列。谢谢。

【问题讨论】:

  • 使用 CanCan 获取权限 ;)
  • @MrYoshiji,我已经设置好了一切。我不需要 CanCan :) 这可能只是一个小问题。

标签: ruby-on-rails activerecord ruby-on-rails-4


【解决方案1】:

您需要使用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

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 2021-11-08
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多