如何通过另一个模型在模型中创建记录?

时间:2012-02-16 21:15:10

标签: ruby-on-rails ruby models controllers

我对Rails相当新,我有一个新手问题。

我有三种模式:

用户 - <客户 - <项目

要创建一个新项目,我想在我的项目控制器中执行此操作:

def create
  @project = current_user.projects.build(params[:project])
end

但是,我总是得到一个错误,说客户端ID缺失,即我无法在Projects表中设置。

有人能告诉我这里缺少什么吗?

在我的用户模型中,我有......

has_many :projects, :through => :clients

......我认为应该这样做

@user.projects.build()

的工作。但事实并非如此。

3 个答案:

答案 0 :(得分:1)

我认为您的项目表/模型需要在使用

时指定使用的client_id
current_user.projects.build(params[:project])

我认为你应该使用像

这样的东西
active_project = current_user.active_project
active_project.clients.build(params[:project])

这只是一个例子。

答案 1 :(得分:1)

通过您的关联,Project属于属于Client的{​​{1}}。您可能需要考虑重新设计。

但是如果您希望保留当前的设计,可以通过几种方式修复此错误

User

OR

@client = Client.find params[:client]
@project = @user.project.build params[:project], :client_id => @client.id

无论哪种方式,用户都没有项目。他们有客户,而这些客户又有项目。您可能希望将@project = @user.clients.find(params[:client]).projects.build(params[:project]) 模型作为连接模型。在这种情况下......

Project

答案 2 :(得分:1)

进行该调用时出现的问题是哪个客户端进行此操作?仅在current_user.projects上构建并不提供此信息。要解决这个问题,我们必须查看您的表单和/或路由,以提供要使用的客户端的信息。

例如,您可以让表单实际上以客户端开头,并在表单中使用嵌套资源,然后提供新项目。