以嵌套形式更新现有模型(用户)以获取新模型(项目)

时间:2015-08-19 17:38:20

标签: ruby-on-rails ruby

使用Rails 4.2.3

我想创建一个表单来更新模型(用户)并创建新表单(Project,Rewards,BankAccount)

我的模特:

class User < ActiveRecord::Base
  has_many :projects
  def self.permitted_params
    [:id, :last_name, ... , bank_account_attributes: BankAccount.permitted_params]
  end
    ...
end

class Project < ActiveRecord::Base
  belongs_to :user
  accepts_nested_attributes_for :user

  def self.permitted_params
    [:name, :description, ...]
  end
    ...
end

形式:

<%= simple_form_for @project, html: { class: 'saveable-form' } do |f| %>
  <%= f.input :name %>
  ...

  <%= f.simple_fields_for :user do |user| %>
      <%= render 'user_fields', f: user %>
  <% end %>
<% end %>

控制器

class ProjectsController < ApplicationController
  def new
    @project = Project.new
    @project.user = current_user
    @project.user.build_bank_account
  end

...

  def project_params
    params.require(:project).permit(
      Project.permitted_params,
      rewards_attributes: Reward.permitted_params,
      user_attributes: User.permitted_params
    )
  end
end

这是一个非常简单的形式。

但是当我尝试提交时,我得到了这个:

Couldn't find User with ID=1 for Project with ID=

我得到了一个临时修复,发现here

这是对Rails 2.3.8的修复。 我希望有一个DRYer解决方案。

建议?有没有人已经遇到过这个问题,你是如何解决这个问题的?

以下是完整代码:

形式: http://pastebin.com/NwfxCJQH

控制器: http://pastebin.com/U2g2Sv04

型号: http://pastebin.com/5QsCsXN6

1 个答案:

答案 0 :(得分:0)

听起来你需要在课堂上使用倒数。在rails文档中查找,this article也提供了很好的解释。

顺便说一下,我同意@ max的注释重新允许属于控制器的参数。以下是如何将控制器中的参数列入白名单并包含关联的属性。

def user_params
  params.require(:user).permit(
    :id, :last_name, bank_account_attributes: [:id, :account_number, :sort_code]
  )
end