我有一个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模型中分配会话变量。
任何其他选项将不胜感激。谢谢
答案 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