rails将变量从模型传递到另一个控制器

时间:2015-12-30 09:21:02

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

我有一个rails项目,我想将一个变量从我的User模型传递给另一个控制器。

我该怎么做?我知道这不是最好的方法,但我想不出任何其他方法来解决我的问题。

我正在使用Devise登录,如果由于用户被锁定而导致sign_in失败,我想显示一个链接。

在我的用户模型中,我有这个方法

def after_database_authentication
  update_attributes!(password_changed_at: self.last_activity_at)
  user_locked = self.is_locked
end

我想在Post控制器中添加此变量user_locked

所以在我的Post控制器方法new中,我想在这里使用它

def new 
  ap user_locked
end

感觉我唯一的方法是使用会话但不能在rails模型中分配会话变量。

任何其他选项将不胜感激。谢谢

2 个答案:

答案 0 :(得分:1)

当您使用Devise时,可以使用辅助方法current_user。那么你为什么不使用这样的解决方案?

class User
  def locked?
    is_locked
  end
end

UserController
  def new
    current_user.locked?
  end
end

答案 1 :(得分:0)

我认为您对MVC结构感到困惑。

您的model是一个填充了数据库数据的类,或者是以 class 方法/变量形式预定义的数据。

因此,当你问....

  

我想将一个变量从我的用户模型传递到另一个控制器

......上下文完全不正确。

模型

如果您想通过模型传递,您可以将其存储在数据库中(因此模型的某个属性会填充该值),或者你将它作为一个值存储在班级:

#app/models/user.rb
class User < ActiveRecord::Base
   def is_locked?
      true #-> User.new.is_locked? -> true
   end

   def self.is_locked?
      false #-> User.is_locked? -> false
   end
end

根据您撰写的内容,我强烈建议将is_locked作为数据库属性:

$ rails g migration AddIsLockedToUsers

# db/migrate/add_is_locked_to_users________.rb
class AddIsLockedToUsers < ActiveRecord::Migration
   def change
      add_column :users, :is_locked, :boolean, default: false
   end
end

$ rake db:migrate

这会将is_locked?值设置为User模型的属性,这意味着每次调用User时,您都会#app/controllers/posts_controller.rb class PostsController < ApplicationController def new @user = User.find params[:user_id] redirect_to root_path if @user.is_locked? end end 。能够检查它们是否被锁定:

ActiveRecord::Observer

-

除此之外,您可能希望使用after_update#app/models/user.rb class User < ActiveRecord::Base after_update :set_locked, if: "password_changed_at.changed?" private def set_locked self.is_locked = true end end 回调来更新锁定状态:

Not possible