应用程序控制器中的实例变量值未更改

时间:2012-12-30 17:55:43

标签: ruby-on-rails activerecord

我已经找到了解决问题的方法,但我仍然不明白为什么会出现这个问题。 我想我错过了关于内部工作原理的一些事情。

我从几个控制器调用* 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

1 个答案:

答案 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,我不推荐。