CanCan资源条件和带有friendly_id slugs的特殊路由

时间:2013-11-15 10:49:06

标签: ruby-on-rails-3 cancan rails-routing friendly-id update-attributes

我的网页模型有:name属性。我有一个具有名称“home”的页面模型的特定路径,因为我希望在root_url中找到这个特定的Page记录。这有效..但因为我很难对路线进行编码...我只希望角色“super_admin”的用户能够更改:name属性,在页面模型上, name ==“home”。例如,“admin”角色的用户应能够更改“home”<上的:name属性 < / strong> Page。

  1. 我能用CanCan获得那么好的粒度吗?
  2. 我应该将此逻辑放在 PageControllers 更新操作中吗?
  3. 我应该以不同的方式设置“页面#show”路由(不是硬编码)吗?
  4. 不确定如何做这些。 提前感谢任何建议!

    ability.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 个答案:

答案 0 :(得分:1)

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

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 - 对我来说,你的路线看起来不错。这可能是我接近它的方式。