【发布时间】:2020-05-29 13:30:24
【问题描述】:
在我的组织模块中,我尝试在创建组织记录之前为字段分配一个值。
我在模型中使用了 before_create 过滤器,它通常可以正常工作。
但是,当我尝试分配来自会话中定义的 current_user 方法的属性的值时,我收到了 Undefined method '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
我很高兴了解为什么它在模型中不起作用。
【问题讨论】:
-
current_user方法可以从控制器(假设SessionsHelper包含在ApplicationController中)和视图(默认情况下)访问。 -
您在模型内部无权访问 current_user。如果没有更好的方法,请将其作为模型内部方法的参数。通常有。
标签: ruby-on-rails ruby-on-rails-4