我在用户控制器中添加了一个before filter和def check priv。假设设置为只有管理员可以查看/编辑所有配置文件,并且只有创建的用户才能查看自己的配置文件。像以前任何人都可以查看/编辑配置文件我尝试过几种方法,都没有用。当我以管理员或普通用户的身份查看个人资料时,我收到“未经授权”的消息。
任何帮助都将不胜感激。
users_controller:
before_filter :check_privileges, :only => [:edit, :update]
def check_privileges
unless current_user.admin? || current_user.id == params[:id]
flash[:warning] = 'not authorized!'
redirect_to root_path
end
end
的index.html:
<%= link_to user.name, user %>
<% if (current_user.admin? || current_user) == @user %>
<%= link_to "Edit #{user} profile", user %>
| <%= link_to "delete", user, method: :delete,
data: { confirm: "You sure?"} %>
<% end %>
答案 0 :(得分:1)
我的应用程序中有类似的方法,尝试这样的方法:
def check_privileges
return if current_user.admin? # this user is an admin, if is not the case do:
flash[:warning] = 'not authorized!'
redirect_to root_path
end
更新1
再次尝试将if条件更改为以下
if (condition || condition)
或
if ((condition) || (condition))
问题是如果没有声明声明,Ruby解析器将停在第一个条件。
更新2
我认为index.html.erb上的括号中有错误,请尝试以下操作:
<%= link_to user.name, user %>
<% if (current_user.admin? || (current_user == @user)) %>
<%= link_to "Edit #{user} profile", user %>
| <%= link_to "delete", user, method: :delete,
data: { confirm: "You sure?"} %>
<% end %>
答案 1 :(得分:0)
思考的食物也许你可以这样做:
def correct_user
@user = User.find(params[:id])
if current_user.role? :administrator
#Allow admin to access everyone account
else
access_denied unless current_user?(@user)
end
end
然后在您的视图中,您的视图会执行if statement
。或者我最好的建议是使用像CanCan这样的东西。这样的东西可以让你很容易地设置角色身份验证。如果您查看它,可以在ability.rb
中设置一定数量的规则,然后您可以在视图上强制执行。
如果你想使用CanCan的方法,你可以在你的能力中做这样的事情.rb
def initialize(user)
user ||= User.new # guest user
# raise user.role?(:administrator).inspect
if user.role? :administrator
can :manage, :all
can :manage, User
elsif user.role? :employee
can :read, :all
end
上面是一个例子......所以在你的views
中你可以通过做类似的事情来强制执行这种规则
<%= link_to user.name, user %>
<% if can? :manage, @user %>
<%= link_to "Edit #{user} profile", user %>
| <%= link_to "delete", user, method: :delete,
data: { confirm: "You sure?"} %>
<% end %>
这样的事情应该有效。你的选择有希望这有帮助:)