如何在模型中访问控制器的实例变量?
在这个例子中,我想访问模型内部的实例变量@user
。
后控制器
class PostController < ApplicationController
def destroy
@user = User.find(params[:user_id])
post = Post.find(params[:id])
end
end
发布模型
class Post < ActiveRecord::Base
belongs_to :user
before_destroy :check_if_owned_by_user
if self.user != @user
return false
end
end
end
答案 0 :(得分:0)
您无法在帖子模型中访问@user。回调不接受自动触发的参数。你必须从控制器显式调用该方法。像这样。
class PostController < ApplicationController
def destroy
@user = User.find(params[:user_id])
post = Post.find(params[:id])
if post.check_if_owned_by_user(@user)
#delete it
end
end
end
class Post < ActiveRecord::Base
belongs_to :user
def check_if_owned_by_user(user)
self.user == user
end
end
答案 1 :(得分:0)
检查当前用户是否被允许删除对象是一个授权问题,应该在您的授权方法中处理(例如cancan)。
如果必须手动处理,请考虑使用服务对象来实现相同目的。一旦积累,回调就是混乱的东西。
class DestroyPost
def initialize post, user
@post = post
@user = user
end
def call
return false unless @post.user = @user
@post.destroy
end
end
您在控制器中调用DestroyPost.new(@post, @user).call
而不是@post.destroy