2015-07-19 75 views
0

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

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

可能重复(http://stackoverflow.com/questions/2419120/ruby- on-rails-access-controller-variable-from-model) – Pavan

回答

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 
+0

似乎很危险依靠每一个控制器来记住包含该条件 - 如果可能,我宁愿将它保留在模型中 –

+0

您可能需要更改逻辑以允许只有那些有权访问的用户才能删除。还包括条件。但根据我的知识,我不认为你可以传递参数给回调... – Athar

+0

我会实现它作为一个before_action到PostsController。 –

0

检查当前用户是否被允许删除的对象是授权的关注,并应您的授权方法(如康康舞)中进行处理。

如果您必须手动处理它,请考虑使用服务对象来实现相同。回调一旦累积就是凌乱的事情。

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

[Ruby on Rails的 - 从模型访问控制器变量]的