2015-08-14 96 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訪問在你的模型中。

相關問題