我有一个复选框,如果选中它,就可以创建名为Engineer的子资源。我试图通过我的模型来创建它,因为我可以在那里调用after_save方法。
这是我的代码:
models/user.rb
class User < ActiveRecord::Base
has_many :armies
has_many :engineers
endmodels/army.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
endmodels/engineer.rb
class Engineer < ActiveRecord::Base
belongs_to :user
belongs_to :army
endcontrollers/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'我怎样才能解决这个问题,或者有没有其他方法可以解决这个问题?不确定这是否应该在控制器或模型中进行,但我只能把它放在模型中。
谢谢。
发布于 2012-08-08 23:14:20
将belongs_to :user添加到Army模型中
在Army#if_siege中,按以下方式更新Engineer.create!
Engineer.create!( :user_id => self.user.id, :army_id => self.id )发布于 2012-08-08 23:19:03
首先,current_user对象将不存在于模型层的上下文中,除非您的身份验证能够使它可用。不过,这通常是一种非线程安全方法。也许对你来说这不是问题所在。
尽管如此,解决这一问题的一种方法(也许不是理想的方法)是在名为attr_accessor的对象上创建模型中的一个。然后在current_user实例可用的控制器中的新动作中将current_user设置为此。
# in the Army model
attr_accessor :the_user
# in the Army Controller
@army = Army.new(:the_user => current_user.id)您还必须添加一个隐藏字段来将此值存储在视图中,以便将其贯彻到create操作中。
只是一个观察,但我相当肯定,在"if_seige“方法中,自调用是多余的。在这种方法中,self应该已经被限定为陆军对象。
https://stackoverflow.com/questions/11874397
复制相似问题