【问题标题】:Ruby on Rails - Does the scope of SessionsHelper reach models?Ruby on Rails - SessionsHelper 的范围是否达到模型?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 2020-04-23
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多