首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不是从父模型创建的子模型?

不是从父模型创建的子模型?
EN

Stack Overflow用户
提问于 2012-08-08 22:55:21
回答 2查看 78关注 0票数 0

我有一个复选框,如果选中它,就可以创建名为Engineer的子资源。我试图通过我的模型来创建它,因为我可以在那里调用after_save方法。

这是我的代码:

models/user.rb

代码语言:javascript
复制
class User < ActiveRecord::Base
  has_many :armies
  has_many :engineers  
end

models/army.rb

代码语言:javascript
复制
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

models/engineer.rb

代码语言:javascript
复制
class Engineer < ActiveRecord::Base
  belongs_to :user
  belongs_to :army
end

controllers/armies_controller.rb

代码语言:javascript
复制
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方法带来了一个错误:

代码语言:javascript
复制
undefined local variable or method `current_user'

我怎样才能解决这个问题,或者有没有其他方法可以解决这个问题?不确定这是否应该在控制器或模型中进行,但我只能把它放在模型中。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-08 23:14:20

belongs_to :user添加到Army模型中

Army#if_siege中,按以下方式更新Engineer.create!

代码语言:javascript
复制
Engineer.create!( :user_id => self.user.id, :army_id => self.id )
票数 1
EN

Stack Overflow用户

发布于 2012-08-08 23:19:03

首先,current_user对象将不存在于模型层的上下文中,除非您的身份验证能够使它可用。不过,这通常是一种非线程安全方法。也许对你来说这不是问题所在。

Current User Instantiation

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

代码语言:javascript
复制
# in the Army model
attr_accessor :the_user

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

您还必须添加一个隐藏字段来将此值存储在视图中,以便将其贯彻到create操作中。

只是一个观察,但我相当肯定,在"if_seige“方法中,自调用是多余的。在这种方法中,self应该已经被限定为陆军对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11874397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档