将变量从控制器传递到模型而不使用实例变量或参数?

时间:2019-08-28 11:21:46

标签: ruby-on-rails ruby devise

我已经重写了Devise方法send_devise_notification,以便能够以自己的方式发送电子邮件:

class User
  include Mongoid::Document
  devise :confirmable, :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :lockable

  protected

    def send_devise_notification(notification, *args)
      # I do lots of crazy stuff here...
    end
end

我的问题是我需要将设计控制器中的变量传递给用户模型中的此方法。

如果我想与控制器中的其他方法共享此变量,则只需设置一个实例变量:

class ConfirmationsController < Devise::ConfirmationsController

  def create
    @foo = "bar"
    super
  end
end

但是由于实例变量没有从我的控制器传递到我的模型,所以这种方法行不通。

由于send_devise_notification方法是由devise gem在各种地方调用的,因此我认为将其传递给参数可能会变得非常复杂。

那么如何将变量从控制器传递到模型?

1 个答案:

答案 0 :(得分:1)

将某些东西从控制器传递到模型的最干净方法是在模型类中添加虚拟属性:

在您的models / User.rb文件顶部附近:

attr_accessor :virtual_attribute_name_here

然后,您可以在控制器中将该属性设置为任何您喜欢的属性,就好像它是Active Record属性一样:

@user.virtual_attribute_name_here = "Some thing"

然后在模型中,您可以通过以下方式在您的方法中访问它:

 def send_devise_notification(notification, *args)
   if self.virtual_attribute_name_here == 'Some thing'
     # I do lots of crazy stuff here...
   end
 end