我有一个具有:name 属性的页面模型。我有一个名为 "home"的页面模型的特定路由,因为我希望在 root_url 中找到这个特定的页面记录。这行得通..但是因为我正在对路线进行硬编码...我只希望具有“super_admin”角色的用户能够更改页面模型上的:name 属性,其中name == "home"。例如,具有“admin”角色的用户不能更改“home”页面上的:name 属性。
- 我可以用 CanCan 得到细粒度吗?
- 我应该将此逻辑放在PageControllers更新操作中吗?
- 我应该以不同的方式设置“page#show”路线(不是硬编码)吗?
不知道如何做这些。提前感谢您的任何建议!
能力.rb
elsif user.role == "admin"
can :manage, :all
cannot :update, Page, ["name == ?", "home"] do |page|
page.name == "home"
end
end
routes.rb(我使用friendly_id从:name 属性生成 slug )
match '/:slug', :to => "pages#show", :as => :slug, :via => :get
root :to => 'pages', :controllers => "pages", :action => "show", :slug => "home"
pages_controller.rb(标准)
def update
@page = Page.find(params[:id])
respond_to do |format|
if @page.update_attributes(params[:page])
format.html { redirect_to @page, notice: 'Page was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @page.errors, status: :unprocessable_entity }
end
end
end