用于更新同一个表的多个用户级别

时间:2014-02-24 21:22:26

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

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

我有这个型号:

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仍为假,但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 个答案:

答案 0 :(得分: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