我的Rails项目中有users
和projects
个脚手架。我还有一个admin
控制器和视图,只有管理员用户才能访问。我希望index
和create
模型的users
和projects
控制器操作只能由admin
视图访问(使用render :partial > 'index'
)但我不想让网站的访问者能够输入http://railsapp.host/users
并获得部分呈现。我如何实现这一目标?
澄清一下,我的问题与用户角色无关。我有所有require_admin帮助程序的authlogic,但我甚至不希望管理员用户能够直接从浏览器访问index
users
路由。实际上,我想将index
控制器操作仅限于admin#index
的视图代码,如下所示:
<%= render '/users/index' %>
答案 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