我是Rails,Rails_Admin和Devise的新手。试图在模型中获取current_user,我认为应该由Devise提供:
class Item < ActiveRecord::Base
attr_accessible :user_id
belongs_to :user, :inverse_of => :items
after_initialize do
if new_record?
self.user_id = current_user.id unless self.user_id
end
end
end
在Rails_Admin中,我得到:
undefined local variable or method `current_user' for #<Item:0x007fc3bd9c4d60>
与
相同self.user_id = _current_user.id unless self.user_id
我看到config / initializers / rails_admin.rb中有一行但不确定它的作用:
config.current_user_method { current_user } # auto-generated
答案 0 :(得分:4)
current_user不属于模型。这个答案有一些解释。
答案 1 :(得分:3)
您无法在模型中引用current_user,因为它仅适用于控制器和视图。这是因为它在 ApplicationController 中定义。解决这个问题的方法是在控件中创建项目时设置 user 属性。
class ItemsController < Application Controller
def create
@item = Item.new(params[:item])
@item.user = current_user # You have access to current_user in the controller
if @item.save
flash[:success] = "You have successfully saved the Item."
redirect_to @item
else
flash[:error] = "There was an error saving the Item."
render :new
end
end
end
此外,为确保在未设置 user 属性的情况下未保存项,您可以对user_id进行验证。如果未设置,项将不会保存到数据库。
class Item < ActiveRecord::Base
attr_accessible :user_id
belongs_to :user,
:inverse_of => :items # You probably don't need this inverse_of. In this
# case, Rails can infer this automatically.
validates :user_id,
:presence => true
end
当您使用after_initialize回调在模型中设置用户时,验证本质上解决了您尝试执行的操作。保证在没有该信息的情况下不保存项。