2015-08-14 98 views
0

有一个在application_controller一个辅助方法:Rails - 模型中可用的控制器中的辅助方法?

def current_user 
     @current_user ||= User.find(session[:user_id]) 
     return @current_user 
    end 

我想成立before_save回调在模型 - 所以,当ActiveRecord的更新的current_user.id将被保存。

基本上,只要模型更改或修改并保存,我想确保updated_by列填充它的模型/

但我不知道如何访问当前用户的模式?

任何人都可以建议吗?

+0

你是什么意思的帮助方法在application_controller? –

+0

在application_controller的顶端有这一行:helper_method:current_user – user3437721

+0

我的感觉是多一点代码会有帮助。具体来说,是Controller正在调用的操作。模型和它是'before_save'。 –

回答

0

你可以做这样的事情来访问在控制器中声明的实例变量来自型号

class User < ActiveRecord::Base 
    cattr_accessor :current_user 
end 

class ApplicationController < ActionController::Base 
     before_filter :current_user 

     def current_user 
     @current_user ||= User.find(session[:user_id]) 
     User.current_user = @current_user 
    end 
    end 
end 
0

这是不可能的,current_user仅在控制器中可用。你应该通过CURRENT_USER ID的方法,例如:

在控制器方法:

def action 
    method_with_user_id(current_user.id) 
end 
模型中的类定义

def method_with_user_id(user_id) 
    #things with the user id 
end 
+0

谢谢我目前正在这样做,但我想创建一个before_save回调,以便更新的用户都将获得该模型的更新,我不必调用任何方法 – user3437721

+0

什么意思是“让更新的用户都将获得为该模型更新“? –

0

辅助方法是不适用于仅适用于观点的模型。

我认为,而不是在模型中设置before_save并通过current_user.id我认为你的模型和用户之间有一个关系,所以你应该建立关系,并在create action中传递用户对象该模型。

而在你的应用程序控制器中,你应该有这样的东西。

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    def current_user 
     @current_user ||= User.find(session[:user_id]) 
     return @current_user 
    end 
end 

而在您的模型控制器中,您可以访问该方法。

def create 
    current_user.my_model.create(params_model) 
end 
0

作为设计选择,不建议从模型中调用控制器助手。该模型不应该知道它的控制器。这不是Railsy的做事方式。

为了得到一个解决办法,你可以在你的控制器的类属性设置的实例变量@current_user

class ApplicationController < ActionController::Base 
    before_filter :set_current_user 
    def set_current_user 
    @current_user ||= User.find(session[:user_id]) 
    Account.current_user = @current_user 
    end 
end 

然后,在你的模型:

class User < ActiveRecord::Base 
    cattr_accessor :current_user 
end 

然后只是@current_userAccount.current_user访问在你的模型中。

相关问题