2013-12-19 43 views
0

ers,Ruy on Rails - SessionsHelper的範圍是否覆蓋模型?

在我的組織模塊中,我嘗試在創建組織記錄之前爲字段賦值。

我在模型中使用before_create過濾器,通常工作正常。 但是,當我嘗試分配來自會話中定義的current_user方法的屬性的值時,我得到一個未定義的方法'current_user'錯誤消息。

因爲這樣做在控制器中工作正常,我徘徊爲什麼它不能在模型中工作?

這是我的用於模型的代碼:

# == Schema Information 
# 
# Table name: organisations 
# 
# id      :integer   not null, primary key 
# playground_id   :integer 
# code     :string(255) 
# name     :string(255) 
# description   :text 
# parent_organisation_id :integer 
# organisation_level  :integer 
# hierarchy    :string(255) 
# created_by    :string(255) 
# updated_by    :string(255) 
# created_at    :datetime   not null 
# updated_at    :datetime   not null  
# 

class Organisation < ActiveRecord::Base 

### before filter 
    before_create :set_code 
    before_create :set_hierarchy 

    validates :code, presence: true, uniqueness: true 
    validates :name, presence: true, uniqueness: true 
    validates :organisation_level, presence: true 
    validates :created_by , presence: true 
    validates :updated_by, presence: true 
# validates :owner_id, presence: true 
# validates :status_id, presence: true 
    validates :playground_id, presence: true 
# belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"  # helps retrieving the owner name 
# belongs_to :status, :class_name => "Parameter", :foreign_key => "status_id" # helps retrieving the status name 
     belongs_to :organisation 
     has_many :organisations 


### private functions definitions 
    private 

    ### before filters 
    def set_code 
     if Organisation.count > 0 
     self.code = self.organisation.code + '-' + code 
     end 
    end 

    def set_hierarchy 
     if Organisation.count == 0 
     self.hierarchy = current_user.current_playground_id.to_s + '.001' 
     else 
     last_one = Organisation.maximum("hierarchy") 
     self.hierarchy = last_one.next 
     end 
    end 

end 

這是我的SessionsHelper(從導軌教程啓發)代碼

module SessionsHelper 

    def sign_in(user) 
    remember_token = User.new_remember_token 
    cookies.permanent[:remember_token] = remember_token 
    user.update_attribute(:remember_token, User.encrypt(remember_token)) 
    self.current_user = user 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
    remember_token = User.encrypt(cookies[:remember_token]) 
    @current_user ||= User.find_by(remember_token: remember_token) 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    def sign_out 
    self.current_user = nil 
    cookies.delete(:remember_token) 
    end 

end 

下面是一個例子來自分配工作的控制器:

@business_flow.playground_id = current_user.current_playground_id 

我很樂意理解它爲什麼不能在模型中工作。

非常感謝您的幫助,

最好的問候,

弗雷德

+0

'current_user'方法可以從控制器訪問(提供'SessionsHelper'包含在'ApplicationController'中)和視圖(默認情況下)。 –

+0

您無法在模型內訪問current_user。如果沒有更好的方法,請將其作爲模型內部方法的參數。通常有。 – devanand

回答

0

SessionsHelper模塊被納入到你的控制器類,所以你可以使用它的方法從那裏。它不包含在模型類中。

事實上,即使您手動將它包含在內,它也可能不起作用,因爲該模型需要訪問cookies方法以使current_user方法起作用。 cookies來自ActionController方法。

要實現您想要的功能,請嘗試在創建該對象的控制器中對您的Organisation對象進行更改,並傳入控制器可以訪問的用戶信息。