我正在尝试构建一个简单的网站,用户可以在其中撰写文章,但管理员需要在网站上显示之前批准这些文章。此外,在用户创建文章后,文章不会立即发送给管理员。用户首先需要点击按钮"发送"关于文章属性。
我有这个型号:
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
用户创建文章后,published
和sent
为false。在文章属性中,用户具有"发送"按钮。点击该按钮后,published
仍为假,但sent
现在为真。现在,在管理员控制面板中,管理员会看到新文章,当他点击按钮"发布"时,published
和sent
现在都是正确的。上传文章的用户可以删除文章并将published
设置为false。
我正在做的所有动作,例如:
<%= link_to 'Undo sent', article_path(article, :article => {:sent => false}), :method => :put %>
问题是我不知道如何限制访问。普通用户可以将列sent
更改为true和false,但列published
只能更改为false。只有管理员可以将列published
更改为true和false。
如何在控制器内部实现这一点,以确保安全?所有用户都有我可以访问的角色列。谢谢。
答案 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