0

我有一个复选框,如果选中该复选框,则可以创建我的名为 Engineer 的子资源。我正在尝试通过我的模型创建它,因为那是我可以调用该after_save方法的地方。

这是我的代码:

模型/用户.rb

class User < ActiveRecord::Base
  has_many :armies
  has_many :engineers  
end

模型/军队.rb

class Army < ActiveRecord::Base
 has_many :engineers
 attr_reader :siege
 after_save :if_siege
 private

 def if_siege
   if self.siege
    Engineer.create!( :user_id => current_user.id, :army_id => self.id )
   end
 end
end

模型/工程师.rb

class Engineer < ActiveRecord::Base
  belongs_to :user
  belongs_to :army
end

控制器/armies_controller.rb

def new
  @army = Army.new
end

def create
  @army = current_user.armies.build(params[:army])
    if @army.save
      redirect_to new_army_path
    else
      render :new
    end
  end
end

if_siege尽管对于我的方法,这给了我一个错误:

undefined local variable or method `current_user'

我该如何解决这个问题,或者有其他方法可以做到这一点吗?不确定这是否应该放入控制器或模型中,但我只能将其放入模型中。

谢谢。

4

2 回答 2

1

添加belongs_to :userArmy模型

Army#if_siege,更新Engineer.create!如下

Engineer.create!( :user_id => self.user.id, :army_id => self.id )
于 2012-08-08T23:14:20.457 回答
1

首先, current_user 对象不会存在于模型层的上下文中,除非您的身份验证正在做一些事情以使其可用。不过,这通常是一种非线程安全的方法。也许对你来说这不是问题。

当前用户实例化

话虽如此,解决这个问题的一种方法(也许不是理想的方法)是在名为 Army 的对象的模型中创建一个 attr_accessor。然后在current_user 实例可用的控制器中的 Army新操作中将 current_user 设置为此。

# in the Army model
attr_accessor :the_user

# in the Army Controller
@army = Army.new(:the_user => current_user.id)

您还必须添加一个隐藏字段来将此值存储在您的视图中,以将其传递到创建操作。

只是一个观察,但我相当确定在“if_seige”方法中,自我调用是多余的。在该方法中, self应该已经被限定为 Army 对象。

于 2012-08-08T23:19:03.937 回答