模型:未定义的局部变量或方法`current_user'

时间:2012-10-19 15:55:00

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

我是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

2 个答案:

答案 0 :(得分:4)

current_user不属于模型。这个答案有一些解释。

Rails 3 devise, current_user is not accessible in a Model ?

答案 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回调在模型中设置用户时,验证本质上解决了您尝试执行的操作。保证在没有该信息的情况下不保存