Rails允许访问一个页面而不限制整个控制器

时间:2012-04-19 15:19:48

标签: ruby-on-rails-3.1

所以我有3种类型的用户:

admin
moderator
regular user

我将控制器和管理页面锁定在控制器范围的系统中,如下所示:

def authorize
  unless User.find_by_id(session[:user_id]) and User.find_by_id(session[:user_id]).moderator == true
    redirect_to login_url, :notice => "Please log in with a moderator account"
  end
end

def authorize_admin
  unless User.find_by_id(session[:user_id]) and User.find_by_id(session[:user_id]).admin == 1
    redirect_to login_url, :notice => "Only admins can access the page you tried to access"
  end
end

但我需要将常规用户访问多个控制器的编辑页面(当然还有更新操作)。但只需编辑和更新。

如果我这样做:

before_filter :authorize, :except => :edit

然后任何人(即使没有登录)都可以访问这些页面。

我该怎么做呢?

修改

根据Thilo的建议,我将以下内容添加到application_controller.erb文件中:

  def update_successful
    skip_before_filter :authorize
  end

在普通用户编辑条目后能够提供update_successful页面。但是我收到了这个错误:

undefined method `skip_before_filter' for #<HomeController:0x007ff782aeb6f0>

1 个答案:

答案 0 :(得分:1)

您可以明确跳过任何全局应用过滤器:

skip_before_filter :authorize, :only => [:edit, :update]

或者首先不要将其应用于相关行动:

before_filter :authorize, :except => [:edit, :update]

修改

要回答您的进一步问题:将其添加到您的应用程序控制器:

def upload_successful
end

这是一个空方法,它明确定义了Rails在呈现home/upload_successful.html.haml模板时隐式使用的操作。然后,通过修改过滤器从该方法中删除身份验证:

before_filter :authorize, :except => [:upload_successful]

这是Rails中的一个很好的introduction to rendering - 它有助于理解默认情况下的渲染,这是upload_successful模板在没有匹配的控制器或操作定义的情况下显示的内容。