CanCanCan资源条件和带有friendly_id蛞蝓的特殊路由



我有一个具有 :name 属性的页面模型。我有一个名为"home"的页面模型的特定路由,因为我希望在root_url找到此特定页面记录。这行得通..但是因为我正在硬编码路线...我只希望角色为"super_admin"的用户能够在页面模型上更改 :name 属性,其中名称 == "home"。例如,具有"管理员"角色的用户不应能够更改"首页"页上的 :name 属性

  1. 我能用CanCanCan得到那么细粒度吗?
  2. 我应该将此逻辑放在页面控制器更新操作中吗?
  3. 我应该以不同的方式设置"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

我必须承认,我已经读了你的问题三遍,我想我有答案给你......

1 - 是的,我相信是的。 但是,我不相信您的ability.rb代码是正确的。 我的目标是更接近这个:

cannot :update, Page do |page|
  page.name == "home"
end

2 - 如果您在控制器中load_and_authorize_resource,那应该是您所需要的,因为这将为您加载@page

class PagesController < ApplicationController
  load_and_authorize_resource
  def update
    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
end

3 - 对我来说,你的路线看起来不错。 这很可能是我处理它的方式。

相关内容

  • 没有找到相关文章

最新更新