Rails - 仅允许访问控制器操作到服务器端

时间:2012-11-03 13:16:15

标签: ruby-on-rails controller

我的Rails项目中有usersprojects个脚手架。我还有一个admin控制器和视图,只有管理员用户才能访问。我希望indexcreate模型的usersprojects控制器操作只能由admin视图访问(使用render :partial > 'index')但我不想让网站的访问者能够输入http://railsapp.host/users并获得部分呈现。我如何实现这一目标?

澄清一下,我的问题与用户角色无关。我有所有require_admin帮助程序的authlogic,但我甚至不希望管理员用户能够直接从浏览器访问index users路由。实际上,我想将index控制器操作仅限于admin#index的视图代码,如下所示:

<%= render '/users/index' %>

4 个答案:

答案 0 :(得分:2)

最好的rails方式是在应用程序控制器中定义过滤器

 class UsersController < ApplicationController
   before_filter :check_isadmin?, :only => [:create, :index]
 end
 class ProjectsController < ApplicationController
   before_filter :check_isadmin?, :only => [:create, :index]
 end
 class ApplicationControlloller < ApplicationController
   def check_isadmin?
      current_user.admin?
    end
end

答案 1 :(得分:0)

如果您为不同的用户使用角色,则可以检查admin用户的角色,然后渲染部分,例如:

<% if user.isAdmin? %>
  <%= render 'index' %>
<% end %>

答案 2 :(得分:0)

好的,我应该说我是铁轨的亲戚。我想通了。我以为

<%= render '/users/index' %>

实际上是通过users#index代码。我只是发现它只是在没有经过控制器动作的情况下调用视图下的部分。所以我只是将其添加到users控制器

def index
  redirect_to :controller=>'admin', :action=>'index'
end

这似乎达到了我所追求的目标。

感谢您的帮助。

答案 3 :(得分:0)

补充Aayush Khandelwal的答案对我有帮助 before_filter在Rails 5上贬值。请改用before_action。

class UsersController < ApplicationController
   before_action :check_isadmin?, :only => [:create, :index]
end

和in:check_isadmin?如果为false,则重定向到另一页。

def check_isadmin?
  if current_user == nil || !current_user.admin?
    redirect_to root_path
  end
end