【问题标题】:undefined method `total_pages' error in rails4rails4中未定义的方法“total_pages”错误
【发布时间】:2014-11-22 10:16:18
【问题描述】:

我使用 Devise 进行身份验证,使用 cancancan 进行授权。cancancan 在某些控制器上运行良好,但在某些屏幕上会抛出未定义的方法错误。

assessments_controller.rb

    def index    
     @projects = Project.find_by_sql("SELECT project_id, project_name FROM projects WHERE company_id = "+ current_dashboard_user.company_id.to_s +
                                " ORDER BY project_name")

     getProjectId

     getResult #get search result

    respond_to do |format|
     format.html
     format.js
    end    
   end

   def getResult    
    #Search Result page
    if (@project_id != nil && @project_id != "") then
      @assessments = Assessment.find_by_sql("SELECT assess.assessment_id, assess.company_id, assess.project_id, assess.release_cycle_no, 
                                             assess.assessment_description, DATE_FORMAT(assess.start_date,'%d/%m/%Y') start_date_display,
                                             DATE_FORMAT(assess.end_date,'%d/%m/%Y') end_date_display, assess.project_phase_id, pp.project_phase_name,
                                             CASE WHEN assess.closed_status = 'Y' THEN 'Closed' ELSE 'Open' END AS closed_status
                                             FROM assessments assess, project_phases pp
                                             WHERE assess.company_id = " + current_dashboard_user.company_id.to_s +
                                             " AND assess.project_id = " + @project_id.to_s + 
                                             " AND assess.project_phase_id = pp.project_phase_id ORDER BY assess.assessment_id DESC")

      @assessments = @assessments.paginate(:per_page => 5, :page => params[:page])
    end
  end

https://gist.github.com/anonymous/9ccee7be3e7fa2df2bca

我的看法。 https://gist.github.com/anonymous/272e6cc05e01d526ef0a

我得到的错误是 http://imgur.com/1qyHen1

【问题讨论】:

  • total_pageswill_paginate 的方法,而不是cancancan 本身。
  • @blelump 问题出在 cancan 上,因为在该控制器中,cancancan 无法按照 load_and_authorize_resources 方法授权评估资源。所以我们不得不跳过这个索引操作并手动检查每个资源的授权索引。答案已实施并正在发挥作用。

标签: ruby-on-rails ruby devise cancancan


【解决方案1】:

因此您必须为索引操作手动定义授权。

  load_and_authorize_resource
  skip_load_and_authorize_resource :only => [:getProjectId, :getResult, :index]

  def index    
    @projects = Project.find_by_sql("SELECT project_id, project_name FROM projects WHERE company_id = "+ current_dashboard_user.company_id.to_s +
                                    " ORDER BY project_name")
    authorize! :read, @projects
    getProjectId

    getResult #get search result
    authorize! :read, @assessments
    respond_to do |format|
      format.html
      format.js
    end    
  end

【讨论】:

  • Cancan 仅对控制器操作执行授权,而不是所有第三方方法。跳过 :getProjectId, :getResult 的加载资源在此处无效。
  • 是的,这两个动作可以bw删除。
猜你喜欢
  • 2016-07-04
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多