3

我是 Rails、Rails_Admin 和 Devise 的新手。试图在模型中获取我认为应该由 Devise 提供的 current_user:

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
4

2 回答 2

5

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

Rails 3 设计,current_user 在模型中不可访问?

于 2012-10-19T16:35:16.700 回答
3

您不能在模型中引用 current_user ,因为它仅适用于ControllersViews。这是因为它是在ApplicationController中定义的。解决这个问题的方法是在控制器中创建 Item 时设置它的用户属性。

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_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 回调在模型中设置用户时尝试做的事情。保证在没有该信息的情况下不会保存项目。

于 2012-10-19T16:20:29.207 回答