Ruby on Rails - Session Helper的范围是否达到模型?

时间:2013-12-19 10:54:55

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

ers,

在我的组织模块中,我尝试在创建组织记录之前为字段分配值。

我在模型中使用了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代码(灵感来自Rails教程)

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

我很高兴了解为什么它在模型中不起作用。

非常感谢你的帮助,

致以最诚挚的问候,

佛瑞德

1 个答案:

答案 0 :(得分:0)

SessionsHelper模块包含在您的控制器类中,因此您可以从那里使用它的方法。它不包含在模型类中。

实际上,即使您手动包含它也可能无法工作,因为模型需要访问cookies方法才能使current_user方法起作用。 cookies来自ActionController方法。

要实现您的目标,请尝试从创建该对象的控制器中更改Organisation对象,并传入控制器可以访问的用户信息。