我已经找到了解决问题的方法,但我仍然不明白为什么会出现这个问题。 我想我错过了关于内部工作原理的一些事情。
我从几个控制器调用* check_modify_rights *方法,我希望有一个具有适当名称的变量(@post用于post_controller而不是通用的,如@object)
所以在before_filter运行之后,我希望有一个@post实例变量和Post模型。 但是我得到了一个新的Post模型(因为@post = Post.new),当我在方法中检查了object_id时,它们是不同的。
# post_controller
before_filter do |f|
@post = Post.new
f.check_modify_rights @post
end
# application_controller
def check_modify_rights(obj)
return redirect_to login_path, :notice => "Please login" unless @user
p obj.object_id
obj = obj.class.find(params[:id])
p obj.object_id
return if obj.user.id == @user.id or @user.is_admin?
redirect_to posts_path, :notice => "You don't have permission for this action"
end
end
答案 0 :(得分:1)
显然@post = Post.new
将具有与新实例化对象不同的id。
要检索新对象,您可以:
1)使用通用实例变量:@resource = Post.new
2)或:
# in your before filter
@post = f.check_modify_rights @post
# in application controller
return obj if obj.user.id == @user.id or @user.is_admin?
但基本上,你正在重做Cancan,我不推荐。