访问模型内​​部的控制器实例变量

时间:2015-07-19 09:53:11

标签: ruby-on-rails ruby-on-rails-4

如何在模型中访问控制器的实例变量?

在这个例子中,我想访问模型内​​部的实例变量@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

2 个答案:

答案 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